diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c index a8965ee62..fae3d7d0b 100644 --- a/src/dynarec/la64/dynarec_la64_00.c +++ b/src/dynarec/la64/dynarec_la64_00.c @@ -1599,7 +1599,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SMREADLOCK(lock); @@ -1617,7 +1617,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SMREADLOCK(lock); @@ -1634,7 +1634,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); ST_B(xRAX, x1, 0); @@ -1651,7 +1651,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SDxw(xRAX, x1, 0); diff --git a/src/dynarec/la64/dynarec_la64_66.c b/src/dynarec/la64/dynarec_la64_66.c index bee3dcf13..d89dde01f 100644 --- a/src/dynarec/la64/dynarec_la64_66.c +++ b/src/dynarec/la64/dynarec_la64_66.c @@ -802,7 +802,7 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SMREADLOCK(lock); @@ -820,7 +820,7 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); ST_H(xRAX, x1, 0); diff --git a/src/dynarec/la64/dynarec_la64_helper.c b/src/dynarec/la64/dynarec_la64_helper.c index 35ef56f1e..bded34a03 100644 --- a/src/dynarec/la64/dynarec_la64_helper.c +++ b/src/dynarec/la64/dynarec_la64_helper.c @@ -231,7 +231,7 @@ uintptr_t geted(dynarec_la64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, SCRATCH_USAGE(1); grab_segdata(dyn, addr, ninst, scratch, rex.seg, 0); // seg offset is 64bits, so no truncation here - ADDxREGy(hint, scratch, ret); + ADDxREGy(hint, scratch, ret, hint); ret = hint; } *ed = ret; diff --git a/src/dynarec/la64/la64_emitter.h b/src/dynarec/la64/la64_emitter.h index 24fba2c9e..d1e12823d 100644 --- a/src/dynarec/la64/la64_emitter.h +++ b/src/dynarec/la64/la64_emitter.h @@ -2570,11 +2570,11 @@ LSX instruction starts with V, LASX instruction starts with XV. ADD_D(rd, rj, rk); \ } while (0) -#define ADDxREGy(rd, rj, rk) \ +#define ADDxREGy(rd, rj, rk, s1) \ do { \ if (rex.is32bits || rex.is67) { \ - ADDI_W(rk, rk, 0); \ - ADD_D(rd, rj, rk); \ + ADDI_W(s1, rk, 0); \ + ADD_D(rd, rj, s1); \ } else \ ADD_D(rd, rj, rk); \ } while (0) diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c index c6d305ba7..4d812ce89 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_2.c +++ b/src/dynarec/rv64/dynarec_rv64_00_2.c @@ -644,7 +644,7 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SMREADLOCK(lock); @@ -663,7 +663,7 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SMREADLOCK(lock); @@ -680,7 +680,7 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SB(xRAX, x1, 0); @@ -697,7 +697,7 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SDxw(xRAX, x1, 0); diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index b7b9659ea..02025a66b 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -862,7 +862,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SMREADLOCK(lock); @@ -880,7 +880,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MOV64y(x1, u64); if (rex.seg) { grab_segdata(dyn, addr, ninst, x3, rex.seg, 0); - ADDxREGy(x1, x3, x1); + ADDxREGy(x1, x3, x1, x1); } lock = (rex.seg) ? 0 : isLockAddress(u64); SH(xRAX, x1, 0); diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 5b97534af..b5a875d10 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -266,7 +266,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, SCRATCH_USAGE(1); grab_segdata(dyn, addr, ninst, scratch, rex.seg, 0); // seg offset is 64bits, so no truncation here - ADDxREGy(hint, scratch, ret); + ADDxREGy(hint, scratch, ret, hint); ret = hint; } *ed = ret; diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h index 41d9f658d..ea9b3611d 100644 --- a/src/dynarec/rv64/rv64_emitter.h +++ b/src/dynarec/rv64/rv64_emitter.h @@ -134,11 +134,11 @@ ADD(rd, rs1, rs2); \ } \ } while (0) -#define ADDxREGy(rd, rs1, rs2) \ +#define ADDxREGy(rd, rs1, rs2, s1) \ do { \ if (rex.is32bits || rex.is67) { \ - ADDIW(rs2, rs2, 0); \ - ADD(rd, rs1, rs2); \ + ADDIW(s1, rs2, 0); \ + ADD(rd, rs1, s1); \ } else { \ ADD(rd, rs1, rs2); \ } \