extern int printf(const char *str, ...); int main() { int t2 = (int)(-1.847759065f * 4096); printf("%d\n", t2); } $ tcc test.c $ ./a.out $ -7568 (OK) (self compiled now) $ ./configure --cc=tcc $ make $ make install (OK) $ tcc test.c $ ./a.out $ 7568 (WRONG!!!) why: gcc does not have intristics for uint to long double conversion therefore it does cast implicitly, so the sign bit is preserved, but this does not happen when __fixunsxfdi is called because tcc was bootstrapped. solution: force cast to int64 and preserve the sign bit. side effects: not found.
Unified · Split
| @@ -3478,7 +3478,7 @@ again: · 3477 unmodified lines | |||
| 3478 | vtop->c.i = (vtop->c.ld != 0); | 3478 | vtop->c.i = (vtop->c.ld != 0); |
| 3479 | } else { | 3479 | } else { |
| 3480 | if(sf) | 3480 | if(sf) |
| 3481 | vtop->c.i = vtop->c.ld; | 3481 | vtop->c.i = (int64_t)vtop->c.ld; |
| 3482 | else if (sbt_bt == VT_LLONG || (PTR_SIZE == 8 && sbt == VT_PTR)) | 3482 | else if (sbt_bt == VT_LLONG || (PTR_SIZE == 8 && sbt == VT_PTR)) |
| 3483 | ; | 3483 | ; |
| 3484 | else if (sbt & VT_UNSIGNED) | 3484 | else if (sbt & VT_UNSIGNED) |