Skip to content

Commit 132db90

Browse files
committed
Fix JIT regalloc conflicts in memory load
After reset_reg() clears the register allocator state, load instructions (lb/lh/lw/lbu/lhu) could reallocate the same host register for both the address and destination, causing data corruption. This commit uses map_vm_reg_reserved() to prevent reusing the address register.
1 parent 0e4850e commit 132db90

File tree

1 file changed

+13
-21
lines changed

1 file changed

+13
-21
lines changed

src/rv32_jit.c

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,7 @@ GEN(bgeu, {
155155
GEN(lb, {
156156
memory_t *m = PRIV(rv)->mem;
157157
vm_reg[0] = ra_load(state, ir->rs1);
158-
IIF(RV32_HAS(SYSTEM))
159-
(
158+
IIF(RV32_HAS(SYSTEM))(
160159
{
161160
emit_load_imm_sext(state, temp_reg, ir->imm);
162161
emit_alu32(state, 0x01, vm_reg[0], temp_reg);
@@ -180,7 +179,7 @@ GEN(lb, {
180179
emit_cmp_imm32(state, temp_reg, 0);
181180
uint32_t jump_loc_0 = state->offset;
182181
emit_jcc_offset(state, 0x84);
183-
vm_reg[1] = map_vm_reg(state, ir->rd);
182+
vm_reg[1] = map_vm_reg_reserved(state, ir->rd, vm_reg[0]);
184183

185184
emit_load(state, S32, parameter_reg[0], vm_reg[1],
186185
offsetof(riscv_t, X) + 4 * ir->rd);
@@ -207,8 +206,7 @@ GEN(lb, {
207206
GEN(lh, {
208207
memory_t *m = PRIV(rv)->mem;
209208
vm_reg[0] = ra_load(state, ir->rs1);
210-
IIF(RV32_HAS(SYSTEM))
211-
(
209+
IIF(RV32_HAS(SYSTEM))(
212210
{
213211
emit_load_imm_sext(state, temp_reg, ir->imm);
214212
emit_alu32(state, 0x01, vm_reg[0], temp_reg);
@@ -232,7 +230,7 @@ GEN(lh, {
232230
emit_cmp_imm32(state, temp_reg, 0);
233231
uint32_t jump_loc_0 = state->offset;
234232
emit_jcc_offset(state, 0x84);
235-
vm_reg[1] = map_vm_reg(state, ir->rd);
233+
vm_reg[1] = map_vm_reg_reserved(state, ir->rd, vm_reg[0]);
236234

237235
emit_load(state, S32, parameter_reg[0], vm_reg[1],
238236
offsetof(riscv_t, X) + 4 * ir->rd);
@@ -259,8 +257,7 @@ GEN(lh, {
259257
GEN(lw, {
260258
memory_t *m = PRIV(rv)->mem;
261259
vm_reg[0] = ra_load(state, ir->rs1);
262-
IIF(RV32_HAS(SYSTEM))
263-
(
260+
IIF(RV32_HAS(SYSTEM))(
264261
{
265262
emit_load_imm_sext(state, temp_reg, ir->imm);
266263
emit_alu32(state, 0x01, vm_reg[0], temp_reg);
@@ -284,7 +281,7 @@ GEN(lw, {
284281
emit_cmp_imm32(state, temp_reg, 0);
285282
uint32_t jump_loc_0 = state->offset;
286283
emit_jcc_offset(state, 0x84);
287-
vm_reg[1] = map_vm_reg(state, ir->rd);
284+
vm_reg[1] = map_vm_reg_reserved(state, ir->rd, vm_reg[0]);
288285

289286
emit_load(state, S32, parameter_reg[0], vm_reg[1],
290287
offsetof(riscv_t, X) + 4 * ir->rd);
@@ -311,8 +308,7 @@ GEN(lw, {
311308
GEN(lbu, {
312309
memory_t *m = PRIV(rv)->mem;
313310
vm_reg[0] = ra_load(state, ir->rs1);
314-
IIF(RV32_HAS(SYSTEM))
315-
(
311+
IIF(RV32_HAS(SYSTEM))(
316312
{
317313
emit_load_imm_sext(state, temp_reg, ir->imm);
318314
emit_alu32(state, 0x01, vm_reg[0], temp_reg);
@@ -336,7 +332,7 @@ GEN(lbu, {
336332
emit_cmp_imm32(state, temp_reg, 0);
337333
uint32_t jump_loc_0 = state->offset;
338334
emit_jcc_offset(state, 0x84);
339-
vm_reg[1] = map_vm_reg(state, ir->rd);
335+
vm_reg[1] = map_vm_reg_reserved(state, ir->rd, vm_reg[0]);
340336

341337
emit_load(state, S32, parameter_reg[0], vm_reg[1],
342338
offsetof(riscv_t, X) + 4 * ir->rd);
@@ -363,8 +359,7 @@ GEN(lbu, {
363359
GEN(lhu, {
364360
memory_t *m = PRIV(rv)->mem;
365361
vm_reg[0] = ra_load(state, ir->rs1);
366-
IIF(RV32_HAS(SYSTEM))
367-
(
362+
IIF(RV32_HAS(SYSTEM))(
368363
{
369364
emit_load_imm_sext(state, temp_reg, ir->imm);
370365
emit_alu32(state, 0x01, vm_reg[0], temp_reg);
@@ -388,7 +383,7 @@ GEN(lhu, {
388383
emit_cmp_imm32(state, temp_reg, 0);
389384
uint32_t jump_loc_0 = state->offset;
390385
emit_jcc_offset(state, 0x84);
391-
vm_reg[1] = map_vm_reg(state, ir->rd);
386+
vm_reg[1] = map_vm_reg_reserved(state, ir->rd, vm_reg[0]);
392387

393388
emit_load(state, S32, parameter_reg[0], vm_reg[1],
394389
offsetof(riscv_t, X) + 4 * ir->rd);
@@ -415,8 +410,7 @@ GEN(lhu, {
415410
GEN(sb, {
416411
memory_t *m = PRIV(rv)->mem;
417412
vm_reg[0] = ra_load(state, ir->rs1);
418-
IIF(RV32_HAS(SYSTEM))
419-
(
413+
IIF(RV32_HAS(SYSTEM))(
420414
{
421415
emit_load_imm_sext(state, temp_reg, ir->imm);
422416
emit_alu32(state, 0x01, vm_reg[0], temp_reg);
@@ -465,8 +459,7 @@ GEN(sb, {
465459
GEN(sh, {
466460
memory_t *m = PRIV(rv)->mem;
467461
vm_reg[0] = ra_load(state, ir->rs1);
468-
IIF(RV32_HAS(SYSTEM))
469-
(
462+
IIF(RV32_HAS(SYSTEM))(
470463
{
471464
emit_load_imm_sext(state, temp_reg, ir->imm);
472465
emit_alu32(state, 0x01, vm_reg[0], temp_reg);
@@ -515,8 +508,7 @@ GEN(sh, {
515508
GEN(sw, {
516509
memory_t *m = PRIV(rv)->mem;
517510
vm_reg[0] = ra_load(state, ir->rs1);
518-
IIF(RV32_HAS(SYSTEM))
519-
(
511+
IIF(RV32_HAS(SYSTEM))(
520512
{
521513
emit_load_imm_sext(state, temp_reg, ir->imm);
522514
emit_alu32(state, 0x01, vm_reg[0], temp_reg);

0 commit comments

Comments
 (0)