commit d6c9669c3c83ce9f570a9c3528110b666aba88f2
parent d41d91ddd851798349f37d9bb75ed2718bbe28f5
Author: Michael Forney <mforney@mforney.org>
Date: Fri, 25 Aug 2023 15:04:47 -0700
Fix conversion from float/double to unsigned int
signed int can't represent all the values of unsigned int, so we
need to do the conversion to signed long, and use the lower 32 bits
as the result.
Diffstat:
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/amd64/isel.c b/amd64/isel.c
@@ -357,8 +357,13 @@ sel(Ins i, ANum *an, Fn *fn)
kc = Kd;
tmp[4] = getcon(0xc3e0000000000000, fn);
Oftoui:
- if (k == Kw)
+ if (k == Kw) {
+ r0 = newtmp("ftou", Kl, fn);
+ emit(Ocopy, Kw, i.to, r0, R);
+ i.cls = Kl;
+ i.to = r0;
goto Emit;
+ }
r0 = newtmp("ftou", kc, fn);
for (j=0; j<4; j++)
tmp[j] = newtmp("ftou", Kl, fn);
diff --git a/test/fpcnv.ssa b/test/fpcnv.ssa
@@ -92,7 +92,7 @@ function l $dtol(d %f) {
# 0xdcf5fbe299d0148aull, 0xffffffff00000000ull, -1 };
#
# double fin[] = { 0.17346516197824458, 442.0760005466251, 4342856.879893436,
-# 98547543006.49626, 236003043787688.3, 9.499222733527032e+18,
+# 4294967295.0, 98547543006.49626, 236003043787688.3, 9.499222733527032e+18,
# 1.1936266170755652e+19 };
#
# int main() {