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 | #define DEFINE__AEABI_XL2F(name, with_sign) \ | 170 | #define DEFINE__AEABI_XL2F(name, with_sign) \ |
| 171 | unsigned __aeabi_ ## name(unsigned long long v) \ | 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 | unsigned p = 0 /* power */, ret; \ | 174 | unsigned p = 0 /* power */, ret; \ |
| 175 | double_unsigned_struct val; \ | 175 | double_unsigned_struct val; \ |
| 176 | \ | 176 | \ |
| @@ -188,20 +188,28 @@ unsigned __aeabi_ ## name(unsigned long long v) \ · 11 unmodified lines | |||
| 188 | if (s < FLOAT_FRAC_BITS) { \ | 188 | if (s < FLOAT_FRAC_BITS) { \ |
| 189 | ret <<= FLOAT_FRAC_BITS - s; \ | 189 | ret <<= FLOAT_FRAC_BITS - s; \ |
| 190 | ret |= val.low >> (32 - (FLOAT_FRAC_BITS - s)); \ | 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 | ret >>= s - FLOAT_FRAC_BITS; \ | 194 | ret >>= s - FLOAT_FRAC_BITS; \ |
| 195 | } \ | ||
| 193 | s += 32; \ | 196 | s += 32; \ |
| 194 | } else { \ | 197 | } else { \ |
| 195 | for (s = 31, p = 1 << 31; p && !(val.low & p); s--, p >>= 1); \ | 198 | for (s = 31, p = 1 << 31; p && !(val.low & p); s--, p >>= 1); \ |
| 196 | if (p) { \ | 199 | if (p) { \ |
| 197 | ret = val.low & (p - 1); \ | 200 | ret = val.low & (p - 1); \ |
| 198 | if (s <= FLOAT_FRAC_BITS) \ | 201 | if (s <= FLOAT_FRAC_BITS) { \ |
| 199 | ret <<= FLOAT_FRAC_BITS - s; \ | 202 | ret <<= FLOAT_FRAC_BITS - s; \ |
| 200 | else \ | 203 | flb = 0; \ |
| 204 | } else { \ | ||
| 205 | flb = (ret >> (s - FLOAT_FRAC_BITS - 1)) & 1; \ | ||
| 201 | ret >>= s - FLOAT_FRAC_BITS; \ | 206 | ret >>= s - FLOAT_FRAC_BITS; \ |
| 207 | } \ | ||
| 202 | } else \ | 208 | } else \ |
| 203 | return 0; \ | 209 | return 0; \ |
| 204 | } \ | 210 | } \ |
| 211 | if (flb) \ | ||
| 212 | ret++; \ | ||
| 205 | \ | 213 | \ |
| 206 | /* fill exponent bits */ \ | 214 | /* fill exponent bits */ \ |
| 207 | ret |= (s + ONE_EXP(FLOAT)) << FLOAT_FRAC_BITS; \ | 215 | ret |= (s + ONE_EXP(FLOAT)) << FLOAT_FRAC_BITS; \ |
| @@ -222,7 +230,7 @@ DEFINE__AEABI_XL2F(l2f, 1) · 14 unmodified lines | |||
| 222 | #define __AEABI_XL2D(name, with_sign) \ | 230 | #define __AEABI_XL2D(name, with_sign) \ |
| 223 | void __aeabi_ ## name(unsigned long long v) \ | 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 | unsigned tmp, p = 0; \ | 234 | unsigned tmp, p = 0; \ |
| 227 | double_unsigned_struct val, ret; \ | 235 | double_unsigned_struct val, ret; \ |
| 228 | \ | 236 | \ |
| @@ -248,6 +256,13 @@ void __aeabi_ ## name(unsigned long long v) \ · 19 unmodified lines | |||
| 248 | ret.high = tmp >> high_shift; \ | 256 | ret.high = tmp >> high_shift; \ |
| 249 | ret.low = tmp << (32 - high_shift); \ | 257 | ret.low = tmp << (32 - high_shift); \ |
| 250 | ret.low |= val.low >> high_shift; \ | 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 | s += 32; \ | 267 | s += 32; \ |
| 253 | } else { \ | 268 | } else { \ |