diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-08-29 01:48:22 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-28 19:48:22 +0200 |
| commit | abbaf9b593725d5f00d0482d0fc28310046cfd27 (patch) | |
| tree | 7585473bdefc5d122acbaa95cfec3ab9851aa38e /src | |
| parent | 126c59b4a41b3f17b4fdea6e1fd94bd15d1638d7 (diff) | |
| download | box64-abbaf9b593725d5f00d0482d0fc28310046cfd27.tar.gz box64-abbaf9b593725d5f00d0482d0fc28310046cfd27.zip | |
[BOX32][RV64_DYNAREC] Fixed more issues and enable CI for box32 (#1767)
* [BOX32][RV64_DYNAREC] Fixed more issues * fix * fix * enable Ci for box32 * add some comments
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_2.c | 5 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_64.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_emit_math.c | 9 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 17 | ||||
| -rw-r--r-- | src/dynarec/rv64/rv64_emitter.h | 10 |
5 files changed, 30 insertions, 13 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c index e0a841ca..e4eb7aa4 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_2.c +++ b/src/dynarec/rv64/dynarec_rv64_00_2.c @@ -423,10 +423,7 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int DEFAULT; } else { // mem <= reg addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 0, 0); - MV(gd, ed); - if(!rex.w || rex.is32bits) { - ZEROUP(gd); // truncate the higher 32bits as asked - } + if (gd != ed) MV(gd, ed); } break; case 0x8E: diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c index c1ff69df..2ad48874 100644 --- a/src/dynarec/rv64/dynarec_rv64_64.c +++ b/src/dynarec/rv64/dynarec_rv64_64.c @@ -529,10 +529,10 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0xFF: nextop = F8; - grab_segdata(dyn, addr, ninst, x6, seg); switch((nextop>>3)&7) { case 6: // Push Ed INST_NAME("PUSH Ed"); + grab_segdata(dyn, addr, ninst, x6, seg); GETEDOz(x6, 0, x3); PUSH1z(ed); break; diff --git a/src/dynarec/rv64/dynarec_rv64_emit_math.c b/src/dynarec/rv64/dynarec_rv64_emit_math.c index e19acba0..a8557853 100644 --- a/src/dynarec/rv64/dynarec_rv64_emit_math.c +++ b/src/dynarec/rv64/dynarec_rv64_emit_math.c @@ -113,6 +113,9 @@ void emit_add32c(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, i MOV64x(s2, c); ADD(s1, s1, s2); } + if (!rex.w) { + ZEROUP(s1); + } return; } IFX(X_PEND | X_AF | X_CF | X_OF) { @@ -516,8 +519,7 @@ void emit_sub32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s void emit_sub32c(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 RSP and only PEND is needed: ignoring it! if (c > -2048 && c <= 2048) { SUBI(s1, s1, c); @@ -525,6 +527,9 @@ void emit_sub32c(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, i MOV64xw(s2, c); SUBxw(s1, s1, s2); } + if (!rex.w) { + ZEROUP(s1); + } return; } diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 8c9f0adc..9810cf64 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -190,12 +190,14 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ int64_t tmp = F32S; if (sib_reg!=4) { if(tmp && ((tmp<-2048) || (tmp>maxval) || !i12)) { - MOV32w(scratch, tmp); + // no need to zero up, as we did it below + rv64_move32(dyn, ninst, scratch, tmp, 0); if((sib>>6)) { SLLI(ret, xRAX + sib_reg, sib >> 6); ADDW(ret, ret, scratch); } else ADDW(ret, xRAX+sib_reg, scratch); + ZEROUP(ret); } else { if(sib>>6) SLLI(ret, xRAX+sib_reg, (sib>>6)); @@ -217,6 +219,7 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ ADDW(ret, ret, xRAX + sib_reg2); } else ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg); + ZEROUP(ret); } else { ret = xRAX+sib_reg2; } @@ -256,6 +259,7 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ ADDW(ret, ret, xRAX + sib_reg2); } else ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg); + ZEROUP(ret); } else { ret = xRAX+sib_reg2; } @@ -279,7 +283,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ ADDIW(ret, scratch, i32); ZEROUP(ret); } else { - MOV32w(scratch, i32); + // no need to zero up, as we did it below + rv64_move32(dyn, ninst, scratch, i32, 0); if((nextop&7)==4) { if (sib_reg!=4) { ADDW(scratch, scratch, xRAX+sib_reg2); @@ -334,6 +339,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop ADDW(ret, ret, scratch); } else ADDW(ret, xRAX+sib_reg, scratch); + ZEROUP(ret); } else { if(sib>>6) SLLI(ret, xRAX+sib_reg, (sib>>6)); @@ -355,6 +361,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop ADDW(ret, ret, xRAX + sib_reg2); } else ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg); + ZEROUP(ret); } else { ret = xRAX+sib_reg2; } @@ -364,6 +371,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop MOV32w(ret, tmp); GETIP(addr+delta); ADDW(ret, ret, xRIP); + ZEROUP(ret); switch(lock) { case 1: addLockAddress(addr+delta+tmp); break; case 2: if(isLockAddress(addr+delta+tmp)) *l=1; break; @@ -396,6 +404,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop ADDW(ret, ret, xRAX + sib_reg2); } else ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg); + ZEROUP(ret); } else { ret = xRAX+sib_reg2; } @@ -2418,10 +2427,8 @@ void rv64_move32(dynarec_rv64_t* dyn, int ninst, int reg, int32_t val, int zerou src = reg; } if (lo12 || !hi20) ADDIW(reg, src, lo12); - if((zeroup && ((hi20&0x80000) || (!hi20 && (lo12&0x800)))) - || (!zeroup && !(val&0x80000000) && ((hi20&0x80000) || (!hi20 && (lo12&0x800))))) { + if (zeroup && (val & 0x80000000)) ZEROUP(reg); - } } void rv64_move64(dynarec_rv64_t* dyn, int ninst, int reg, int64_t val) diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h index d4a95a31..3f76135a 100644 --- a/src/dynarec/rv64/rv64_emitter.h +++ b/src/dynarec/rv64/rv64_emitter.h @@ -190,7 +190,15 @@ f28–31 ft8–11 FP temporaries Caller // rd = rs1 + rs2 #define ADDxw(rd, rs1, rs2) EMIT(R_type(0b0000000, rs2, rs1, 0b000, rd, rex.w ? 0b0110011 : 0b0111011)) // rd = rs1 + rs2 -#define ADDz(rd, rs1, rs2) EMIT(R_type(0b0000000, rs2, rs1, 0b000, rd, rex.is32bits ? 0b0111011 : 0b0110011)) +#define ADDz(rd, rs1, rs2) \ + do { \ + if (!rex.is32bits) { \ + ADD(rd, rs1, rs2); \ + } else { \ + ADDW(rd, rs1, rs2); \ + ZEROUP(rd); \ + } \ + } while (0) // rd = rs1 - rs2 #define SUB(rd, rs1, rs2) EMIT(R_type(0b0100000, rs2, rs1, 0b000, rd, 0b0110011)) // rd = rs1 - rs2 |