summary refs log tree commit diff
path: root/amd64
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 /amd64
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.
Diffstat (limited to 'amd64')
-rw-r--r--amd64/isel.c7
1 files changed, 6 insertions, 1 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);