Change rounding mode of long long to float conversion to nearest in libtcc1.
Unified · Split
| @@ -170,7 +170,7 @@ DEFINE__AEABI_D2XLZ(d2lz, 1) · 169 unmodified lines | ||
| 170 | 170 | #define DEFINE__AEABI_XL2F(name, with_sign) \ |
| 171 | 171 | unsigned __aeabi_ ## name(unsigned long long v) \ |
| 172 | 172 | { \ |
| 173 | − int s /* shift */, sign = 0; \ | |
| 173 | + int s /* shift */, flb /* first lost bit */, sign = 0; \ | |
| 174 | 174 | unsigned p = 0 /* power */, ret; \ |
| 175 | 175 | double_unsigned_struct val; \ |
| 176 | 176 | \ |
| @@ -188,20 +188,28 @@ unsigned __aeabi_ ## name(unsigned long long v) \ · 11 unmodified lines | ||
| 188 | 188 | if (s < FLOAT_FRAC_BITS) { \ |
| 189 | 189 | ret <<= FLOAT_FRAC_BITS - s; \ |
| 190 | 190 | ret |= val.low >> (32 - (FLOAT_FRAC_BITS - s)); \ |
| 191 | − } else \ | |
| 191 | + flb = (val.low >> (32 - (FLOAT_FRAC_BITS - s - 1))) & 1; \ | |
| 192 | + } else { \ | |
| 193 | + flb = (ret >> (s - FLOAT_FRAC_BITS - 1)) & 1; \ | |
| 192 | 194 | ret >>= s - FLOAT_FRAC_BITS; \ |
| 195 | + } \ | |
| 193 | 196 | s += 32; \ |
| 194 | 197 | } else { \ |
| 195 | 198 | for (s = 31, p = 1 << 31; p && !(val.low & p); s--, p >>= 1); \ |
| 196 | 199 | if (p) { \ |
| 197 | 200 | ret = val.low & (p - 1); \ |
| 198 | − if (s <= FLOAT_FRAC_BITS) \ | |
| 201 | + if (s <= FLOAT_FRAC_BITS) { \ | |
| 199 | 202 | ret <<= FLOAT_FRAC_BITS - s; \ |
| 200 | − else \ | |
| 203 | + flb = 0; \ | |
| 204 | + } else { \ | |
| 205 | + flb = (ret >> (s - FLOAT_FRAC_BITS - 1)) & 1; \ | |
| 201 | 206 | ret >>= s - FLOAT_FRAC_BITS; \ |
| 207 | + } \ | |
| 202 | 208 | } else \ |
| 203 | 209 | return 0; \ |
| 204 | 210 | } \ |
| 211 | + if (flb) \ | |
| 212 | + ret++; \ | |
| 205 | 213 | \ |
| 206 | 214 | /* fill exponent bits */ \ |
| 207 | 215 | ret |= (s + ONE_EXP(FLOAT)) << FLOAT_FRAC_BITS; \ |
| @@ -222,7 +230,7 @@ DEFINE__AEABI_XL2F(l2f, 1) · 14 unmodified lines | ||
| 222 | 230 | #define __AEABI_XL2D(name, with_sign) \ |
| 223 | 231 | void __aeabi_ ## name(unsigned long long v) \ |
| 224 | 232 | { \ |
| 225 | − int s, high_shift, sign = 0; \ | |
| 233 | + int s /* shift */, high_shift, sign = 0; \ | |
| 226 | 234 | unsigned tmp, p = 0; \ |
| 227 | 235 | double_unsigned_struct val, ret; \ |
| 228 | 236 | \ |
| @@ -248,6 +256,13 @@ void __aeabi_ ## name(unsigned long long v) \ · 19 unmodified lines | ||
| 248 | 256 | ret.high = tmp >> high_shift; \ |
| 249 | 257 | ret.low = tmp << (32 - high_shift); \ |
| 250 | 258 | ret.low |= val.low >> high_shift; \ |
| 259 | + if ((val.low >> (high_shift - 1)) & 1) { \ | |
| 260 | + if (ret.low == UINT_MAX) { \ | |
| 261 | + ret.high++; \ | |
| 262 | + ret.low = 0; \ | |
| 263 | + } else \ | |
| 264 | + ret.low++; \ | |
| 265 | + } \ | |
| 251 | 266 | } \ |
| 252 | 267 | s += 32; \ |
| 253 | 268 | } else { \ |