summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2023-08-25 15:04:47 -0700
committerQuentin Carbonneaux <quentin@c9x.me>2023-08-26 15:16:45 +0200
commitd6c9669c3c83ce9f570a9c3528110b666aba88f2 (patch)
tree53ff27d39d2929d1d52b307697f1d89bbabf61f4
parentd41d91ddd851798349f37d9bb75ed2718bbe28f5 (diff)
downloadroux-d6c9669c3c83ce9f570a9c3528110b666aba88f2.tar.gz
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.
-rw-r--r--amd64/isel.c7
-rw-r--r--test/fpcnv.ssa2
2 files changed, 7 insertions, 2 deletions
diff --git a/amd64/isel.c b/amd64/isel.c
index 0d2affc..d1e4d3b 100644
--- 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
index aea67ac..3466ed2 100644
--- 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() {