| ... | ... | @@ -357,12 +357,19 @@ static void end_float_token(Tokenize *t) { |
| 357 | 357 | // Mask the sign bit to 0 since always non-negative lex |
| 358 | 358 | const uint64_t exp_mask = 0xffffull << exp_shift; |
| 359 | 359 | |
| 360 | | if (shift >= 64) { |
| 360 | // must be special-cased to avoid undefined behavior on shift == 64 |
| 361 | if (shift == 128) { |
| 362 | f_bits.repr[0] = 0; |
| 363 | f_bits.repr[1] = sig_bits[0]; |
| 364 | } else if (shift == 0) { |
| 365 | f_bits.repr[0] = sig_bits[0]; |
| 366 | f_bits.repr[1] = sig_bits[1]; |
| 367 | } else if (shift >= 64) { |
| 361 | 368 | f_bits.repr[0] = 0; |
| 362 | 369 | f_bits.repr[1] = sig_bits[0] << (shift - 64); |
| 363 | 370 | } else { |
| 364 | 371 | f_bits.repr[0] = sig_bits[0] << shift; |
| 365 | | f_bits.repr[1] = ((sig_bits[1] << shift) | (sig_bits[0] >> (64 - shift))); |
| 372 | f_bits.repr[1] = (sig_bits[1] << shift) | (sig_bits[0] >> (64 - shift)); |
| 366 | 373 | } |
| 367 | 374 | |
| 368 | 375 | f_bits.repr[1] &= ~exp_mask; |