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.
This commit is contained in:
Michael Forney 2023-08-25 15:04:47 -07:00 committed by Quentin Carbonneaux
parent d41d91ddd8
commit d6c9669c3c
2 changed files with 7 additions and 2 deletions

View file

@ -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);

View file

@ -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() {