Unified · Split
| @@ -222,7 +222,7 @@ static void load_large_constant(int rr, int fc, uint32_t pi) · 221 unmodified lines | ||
| 222 | 222 | EI(0x13, 1, rr, rr, 12); // slli RR, RR, 12 |
| 223 | 223 | EI(0x13, 0, rr, rr, (fc + (1 << 19)) >> 20); // addi RR, RR, up(lo(fc)) |
| 224 | 224 | EI(0x13, 1, rr, rr, 12); // slli RR, RR, 12 |
| 225 | − fc = fc << 12 >> 12; | |
| 225 | + fc = (fc + (1 << 7)) << 12 >> 12; | |
| 226 | 226 | EI(0x13, 0, rr, rr, fc >> 8); // addi RR, RR, lo1(lo(fc)) |
| 227 | 227 | EI(0x13, 1, rr, rr, 8); // slli RR, RR, 8 |
| 228 | 228 | } |
| @@ -233,7 +233,7 @@ ST_FUNC void load(int r, SValue *sv) · 4 unmodified lines | ||
| 233 | 233 | int v = fr & VT_VALMASK; |
| 234 | 234 | int rr = is_ireg(r) ? ireg(r) : freg(r); |
| 235 | 235 | int fc = sv->c.i; |
| 236 | − int save_fc = fc; | |
| 236 | + uint64_t save_fc = sv->c.i; | |
| 237 | 237 | int bt = sv->type.t & VT_BTYPE; |
| 238 | 238 | int align, size; |
| 239 | 239 | if (fr & VT_LVAL) { |
| @@ -264,7 +264,7 @@ ST_FUNC void load(int r, SValue *sv) · 24 unmodified lines | ||
| 264 | 264 | si >>= 32; |
| 265 | 265 | if (si != 0) { |
| 266 | 266 | load_large_constant(rr, fc, si); |
| 267 | − fc &= 0xff; | |
| 267 | + fc = fc << 24 >> 24; | |
| 268 | 268 | } else { |
| 269 | 269 | o(0x37 | (rr << 7) | ((0x800 + fc) & 0xfffff000)); //lui RR, upper(fc) |
| 270 | 270 | fc = fc << 20 >> 20; |
| @@ -289,7 +289,7 @@ ST_FUNC void load(int r, SValue *sv) · 18 unmodified lines | ||
| 289 | 289 | si >>= 32; |
| 290 | 290 | if (si != 0) { |
| 291 | 291 | load_large_constant(rr, fc, si); |
| 292 | − fc &= 0xff; | |
| 292 | + fc = fc << 24 >> 24; | |
| 293 | 293 | rb = rr; |
| 294 | 294 | do32bit = 0; |
| 295 | 295 | } else if (bt == VT_LLONG) { |
| @@ -379,7 +379,7 @@ ST_FUNC void store(int r, SValue *sv) · 83 unmodified lines | ||
| 379 | 379 | int fr = sv->r & VT_VALMASK; |
| 380 | 380 | int rr = is_ireg(r) ? ireg(r) : freg(r), ptrreg; |
| 381 | 381 | int fc = sv->c.i; |
| 382 | − int save_fc = fc; | |
| 382 | + uint64_t save_fc = sv->c.i; | |
| 383 | 383 | int bt = sv->type.t & VT_BTYPE; |
| 384 | 384 | int align, size = type_size(&sv->type, &align); |
| 385 | 385 | assert(!is_float(bt) || is_freg(r) || bt == VT_LDOUBLE); |
| @@ -406,7 +406,7 @@ ST_FUNC void store(int r, SValue *sv) · 20 unmodified lines | ||
| 406 | 406 | si >>= 32; |
| 407 | 407 | if (si != 0) { |
| 408 | 408 | load_large_constant(ptrreg, fc, si); |
| 409 | − fc &= 0xff; | |
| 409 | + fc = fc << 24 >> 24; | |
| 410 | 410 | } else { |
| 411 | 411 | o(0x37 | (ptrreg << 7) | ((0x800 + fc) & 0xfffff000)); //lui RR, upper(fc) |
| 412 | 412 | fc = fc << 20 >> 20; |