diff --git a/lib/libtcc1.c b/lib/libtcc1.c index 0e466180..89f0018c 100644 --- a/lib/libtcc1.c +++ b/lib/libtcc1.c @@ -541,13 +541,19 @@ unsigned long long __fixunssfdi (float a1) l = MANT(fl1.l); if (exp >= 41) - return (unsigned long long)-1; + return (unsigned long long)-1; else if (exp >= 0) - return (unsigned long long)l << exp; + if(SIGN(fl1.l)) + return (unsigned long long)-(l << exp); + else + return (unsigned long long)l << exp; else if (exp >= -23) - return l >> -exp; + if(SIGN(fl1.l)) + return -(l >> -exp); + else + return l >> -exp; else - return 0; + return 0; } long long __fixsfdi (float a1) @@ -573,13 +579,19 @@ unsigned long long __fixunsdfdi (double a1) l = MANTD_LL(dl1); if (exp >= 12) - return (unsigned long long)-1; + return (unsigned long long)-1; else if (exp >= 0) - return l << exp; + if(SIGND(dl1)) + return -(l >> exp); + else + return l << exp; else if (exp >= -52) - return l >> -exp; + if(SIGND(dl1)) + return -(l >> -exp); + else + return l >> -exp; else - return 0; + return 0; } long long __fixdfdi (double a1) @@ -608,7 +620,12 @@ unsigned long long __fixunsxfdi (long double a1) if (exp > 0) return (unsigned long long)-1; else if (exp >= -63) - return l >> -exp; + { + if(SIGNLD(dl1)) + return -(l >> -exp); + else + return l >> -exp; + } else return 0; } diff --git a/tccgen.c b/tccgen.c index 305a082b..dd6a497a 100644 --- a/tccgen.c +++ b/tccgen.c @@ -3478,7 +3478,7 @@ again: vtop->c.i = (vtop->c.ld != 0); } else { if(sf) - vtop->c.i = (int64_t)vtop->c.ld; + vtop->c.i = vtop->c.ld; else if (sbt_bt == VT_LLONG || (PTR_SIZE == 8 && sbt == VT_PTR)) ; else if (sbt & VT_UNSIGNED)