Skip to content

Commit 2eca4df

Browse files
committed
Correct riscv load_large_constant
1 parent 7c23c48 commit 2eca4df

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

riscv64-gen.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ static void load_large_constant(int rr, int fc, uint32_t pi)
222222
EI(0x13, 1, rr, rr, 12); // slli RR, RR, 12
223223
EI(0x13, 0, rr, rr, (fc + (1 << 19)) >> 20); // addi RR, RR, up(lo(fc))
224224
EI(0x13, 1, rr, rr, 12); // slli RR, RR, 12
225-
fc = fc << 12 >> 12;
225+
fc = (fc + (1 << 7)) << 12 >> 12;
226226
EI(0x13, 0, rr, rr, fc >> 8); // addi RR, RR, lo1(lo(fc))
227227
EI(0x13, 1, rr, rr, 8); // slli RR, RR, 8
228228
}
@@ -233,7 +233,7 @@ ST_FUNC void load(int r, SValue *sv)
233233
int v = fr & VT_VALMASK;
234234
int rr = is_ireg(r) ? ireg(r) : freg(r);
235235
int fc = sv->c.i;
236-
int save_fc = fc;
236+
uint64_t save_fc = sv->c.i;
237237
int bt = sv->type.t & VT_BTYPE;
238238
int align, size;
239239
if (fr & VT_LVAL) {
@@ -264,7 +264,7 @@ ST_FUNC void load(int r, SValue *sv)
264264
si >>= 32;
265265
if (si != 0) {
266266
load_large_constant(rr, fc, si);
267-
fc &= 0xff;
267+
fc = fc << 24 >> 24;
268268
} else {
269269
o(0x37 | (rr << 7) | ((0x800 + fc) & 0xfffff000)); //lui RR, upper(fc)
270270
fc = fc << 20 >> 20;
@@ -289,7 +289,7 @@ ST_FUNC void load(int r, SValue *sv)
289289
si >>= 32;
290290
if (si != 0) {
291291
load_large_constant(rr, fc, si);
292-
fc &= 0xff;
292+
fc = fc << 24 >> 24;
293293
rb = rr;
294294
do32bit = 0;
295295
} else if (bt == VT_LLONG) {
@@ -379,7 +379,7 @@ ST_FUNC void store(int r, SValue *sv)
379379
int fr = sv->r & VT_VALMASK;
380380
int rr = is_ireg(r) ? ireg(r) : freg(r), ptrreg;
381381
int fc = sv->c.i;
382-
int save_fc = fc;
382+
uint64_t save_fc = sv->c.i;
383383
int bt = sv->type.t & VT_BTYPE;
384384
int align, size = type_size(&sv->type, &align);
385385
assert(!is_float(bt) || is_freg(r) || bt == VT_LDOUBLE);
@@ -406,7 +406,7 @@ ST_FUNC void store(int r, SValue *sv)
406406
si >>= 32;
407407
if (si != 0) {
408408
load_large_constant(ptrreg, fc, si);
409-
fc &= 0xff;
409+
fc = fc << 24 >> 24;
410410
} else {
411411
o(0x37 | (ptrreg << 7) | ((0x800 + fc) & 0xfffff000)); //lui RR, upper(fc)
412412
fc = fc << 20 >> 20;

0 commit comments

Comments
 (0)