diff options
author | Michael Forney <mforney@mforney.org> | 2023-08-25 15:04:47 -0700 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2023-08-26 15:16:45 +0200 |
commit | d6c9669c3c83ce9f570a9c3528110b666aba88f2 (patch) | |
tree | 53ff27d39d2929d1d52b307697f1d89bbabf61f4 | |
parent | d41d91ddd851798349f37d9bb75ed2718bbe28f5 (diff) | |
download | roux-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.c | 7 | ||||
-rw-r--r-- | test/fpcnv.ssa | 2 |
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() { |