diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-08-28 20:01:50 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-28 14:01:50 +0200 |
| commit | 189222cb66c6770c0eab465bc2f15941248cb9bf (patch) | |
| tree | 57825ec1b282c6c386d189ad8627cb5f6707a677 /src | |
| parent | 6835c4aaf5d9f6b07652d4be9ccdbf9ba03aff8b (diff) | |
| download | box64-189222cb66c6770c0eab465bc2f15941248cb9bf.tar.gz box64-189222cb66c6770c0eab465bc2f15941248cb9bf.zip | |
[BOX32][RV64_DYNAREC] Added preliminary box32 support to RV64 (#1766)
* [BOX32][RV64_DYNAREC] Added preliminary box32 support to RV64 * fix * fix fix * fix
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_64.c | 24 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_6664.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_emit_math.c | 11 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 8 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 16 | ||||
| -rw-r--r-- | src/dynarec/rv64/rv64_emitter.h | 10 |
6 files changed, 38 insertions, 35 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c index aef4f21c..c1ff69df 100644 --- a/src/dynarec/rv64/dynarec_rv64_64.c +++ b/src/dynarec/rv64/dynarec_rv64_64.c @@ -79,7 +79,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni GETEX(x2, 0, 8); if(!MODREG) { grab_segdata(dyn, addr, ninst, x4, seg); - ADD(x4, x4, wback); + ADDz(x4, x4, wback); wback = x4; } LD(x3, gback, gdoffset+0); @@ -101,7 +101,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { grab_segdata(dyn, addr, ninst, x4, seg); addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0); - ADD(x4, x4, ed); + ADDz(x4, x4, ed); ed = x4; FSD(v0, ed, fixedaddress); SMWRITE2(); @@ -118,7 +118,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { grab_segdata(dyn, addr, ninst, x4, seg); addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0); - ADD(x4, x4, ed); + ADDz(x4, x4, ed); ed = x4; FSW(v0, ed, fixedaddress); SMWRITE2(); @@ -373,7 +373,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MVxw(xRAX+(nextop&7)+(rex.b<<3), gd); } else { // mem <= reg addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); - ADD(x4, ed, x4); + ADDz(x4, ed, x4); SDxw(gd, x4, fixedaddress); SMWRITE2(); } @@ -389,7 +389,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { // mem <= reg SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); - ADD(x4, ed, x4); + ADDz(x4, ed, x4); LDxw(gd, x4, fixedaddress); } break; @@ -403,7 +403,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 0, 0); - ADD(x4, wback, x4); + ADDz(x4, wback, x4); LHU(x1, x4, 0); ed = x1; } @@ -420,12 +420,12 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni POP1z(x3); // so this can handle POP [ESP] and maybe some variant too addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 0, 0); if (ed == xRSP) { - ADD(x4, ed, x4); + ADDz(x4, ed, x4); SDz(x3, x4, 0); } else { // complicated to just allow a segfault that can be recovered correctly ADDIz(xRSP, xRSP, rex.is32bits ? -4 : -8); - ADD(x4, ed, x4); + ADDz(x4, ed, x4); SDz(x3, x4, 0); ADDIz(xRSP, xRSP, rex.is32bits ? 4 : 8); } @@ -440,7 +440,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni u64 = F64; // TODO: could be optimized. MOV64z(x1, u64); - ADD(x1, x1, x4); + ADDz(x1, x1, x4); LDxw(xRAX, x1, 0); break; @@ -453,7 +453,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni u64 = F64; // TODO: could be optimized. MOV64z(x1, u64); - ADD(x1, x1, x4); + ADDz(x1, x1, x4); SDxw(xRAX, x1, 0); SMWRITE2(); break; @@ -500,7 +500,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ed = x3; } else ed = xZR; - ADD(x4, wback, x4); + ADDz(x4, wback, x4); SB(ed, x4, fixedaddress); SMWRITE2(); } @@ -521,7 +521,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ed = x3; } else ed = xZR; - ADD(x4, wback, x4); + ADDz(x4, wback, x4); SDxw(ed, x4, fixedaddress); SMWRITE2(); } diff --git a/src/dynarec/rv64/dynarec_rv64_6664.c b/src/dynarec/rv64/dynarec_rv64_6664.c index 3acac902..a1389aba 100644 --- a/src/dynarec/rv64/dynarec_rv64_6664.c +++ b/src/dynarec/rv64/dynarec_rv64_6664.c @@ -56,7 +56,7 @@ uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } else { grab_segdata(dyn, addr, ninst, x4, seg); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); - ADD(x4, ed, x4); + ADDz(x4, ed, x4); if(rex.w) { SD(gd, x4, fixedaddress); } else { @@ -86,7 +86,7 @@ uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int grab_segdata(dyn, addr, ninst, x4, seg); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); - ADD(x4, ed, x4); + ADDz(x4, ed, x4); if(rex.w) { LD(gd, x4, fixedaddress); } else { diff --git a/src/dynarec/rv64/dynarec_rv64_emit_math.c b/src/dynarec/rv64/dynarec_rv64_emit_math.c index 6175f19d..e19acba0 100644 --- a/src/dynarec/rv64/dynarec_rv64_emit_math.c +++ b/src/dynarec/rv64/dynarec_rv64_emit_math.c @@ -105,14 +105,13 @@ void emit_add32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s void emit_add32c(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s2, int s3, int s4, int s5) { CLEAR_FLAGS(); - if(s1==xRSP && (!dyn->insts || dyn->insts[ninst].x64.gen_flags==X_PEND)) - { + if (s1 == xRSP && (!dyn->insts || dyn->insts[ninst].x64.gen_flags == X_PEND)) { // special case when doing math on ESP and only PEND is needed: ignoring it! - if(c >= -2048 && c < 2048) { - ADDIxw(s1, s1, c); + if (c >= -2048 && c < 2048) { + ADDI(s1, s1, c); } else { - MOV64xw(s2, c); - ADDxw(s1, s1, s2); + MOV64x(s2, c); + ADD(s1, s1, s2); } return; } diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 4cc6e024..8c9f0adc 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -277,6 +277,7 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ } else scratch = xRAX+(nextop&0x07); ADDIW(ret, scratch, i32); + ZEROUP(ret); } else { MOV32w(scratch, i32); if((nextop&7)==4) { @@ -286,7 +287,7 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ SLLI(ret, xRAX + sib_reg, (sib >> 6)); ADDW(ret, ret, scratch); } else - ADDW(ret, scratch, xRAX+sib_reg); + ADDW(ret, scratch, xRAX + sib_reg); } else { PASS3(int tmp = xRAX+sib_reg2); ADDW(ret, tmp, scratch); @@ -295,6 +296,7 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ PASS3(int tmp = xRAX+(nextop&0x07)); ADDW(ret, tmp, scratch); } + ZEROUP(ret); } } } @@ -415,6 +417,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop } else scratch = xRAX+(nextop&0x07)+(rex.b<<3); ADDIW(ret, scratch, i64); + ZEROUP(ret); } else { MOV32w(scratch, i64); if((nextop&7)==4) { @@ -424,7 +427,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop SLLI(ret, xRAX + sib_reg, (sib >> 6)); ADDW(ret, ret, scratch); } else - ADDW(ret, scratch, xRAX+sib_reg); + ADDW(ret, scratch, xRAX + sib_reg); } else { PASS3(int tmp = xRAX+sib_reg2); ADDW(ret, tmp, scratch); @@ -433,6 +436,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop PASS3(int tmp = xRAX+(nextop&0x07)+(rex.b<<3)); ADDW(ret, tmp, scratch); } + ZEROUP(ret); } } } diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index b2579454..cd3990a8 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -213,7 +213,7 @@ } else { \ SMREAD(); \ addr = geted(dyn, addr, ninst, nextop, &wback, x2, S, &fixedaddress, rex, NULL, 1, D); \ - ADD(S, wback, O); \ + ADDz(S, wback, O); \ LDxw(x1, S, fixedaddress); \ ed = x1; \ } @@ -225,15 +225,15 @@ } else { \ SMREAD(); \ addr = geted(dyn, addr, ninst, nextop, &wback, x2, S, &fixedaddress, rex, NULL, 1, D); \ - ADD(S, wback, O); \ + ADDz(S, wback, O); \ LDz(x1, S, fixedaddress); \ ed = x1; \ } -#define WBACKO(O) \ - if (wback) { \ - ADD(O, wback, O); \ - SDxw(ed, O, 0); \ - SMWRITE2(); \ +#define WBACKO(O) \ + if (wback) { \ + ADDz(O, wback, O); \ + SDxw(ed, O, 0); \ + SMWRITE2(); \ } // FAKEED like GETED, but doesn't get anything @@ -310,7 +310,7 @@ } else { \ SMREAD(); \ addr = geted(dyn, addr, ninst, nextop, &wback, x3, x2, &fixedaddress, rex, NULL, 1, D); \ - ADD(x3, wback, i); \ + ADDz(x3, wback, i); \ if (wback != x3) wback = x3; \ LBU(i, wback, fixedaddress); \ wb1 = 1; \ diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h index 2d1c6385..d4a95a31 100644 --- a/src/dynarec/rv64/rv64_emitter.h +++ b/src/dynarec/rv64/rv64_emitter.h @@ -357,12 +357,12 @@ f28–31 ft8–11 FP temporaries Caller #define PUSH1_32(reg) \ do { \ SW(reg, xRSP, 0xFFC); \ - SUBIW(xRSP, xRSP, 4); \ + SUBI(xRSP, xRSP, 4); \ } while (0) -#define POP1_32(reg) \ - do { \ - LWU(reg, xRSP, 0); \ - if (reg != xRSP) ADDIW(xRSP, xRSP, 4); \ +#define POP1_32(reg) \ + do { \ + LWU(reg, xRSP, 0); \ + if (reg != xRSP) ADDI(xRSP, xRSP, 4); \ } while (0) #define POP1z(reg) \ |