diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-09-12 08:54:18 +0000 |
|---|---|---|
| committer | Yang Liu <liuyang22@iscas.ac.cn> | 2023-09-12 08:54:18 +0000 |
| commit | c086a1ff24341625dca76aa33b04a7eff62d791b (patch) | |
| tree | eca087eed307c691139f3ff01f9e69d640e18395 /src | |
| parent | 75958f1f315f15206618185240bab8080c8bfd0f (diff) | |
| download | box64-c086a1ff24341625dca76aa33b04a7eff62d791b.tar.gz box64-c086a1ff24341625dca76aa33b04a7eff62d791b.zip | |
Fixed CI and simplified
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 8 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 30 | ||||
| -rw-r--r-- | src/dynarec/rv64/rv64_emitter.h | 20 |
3 files changed, 20 insertions, 38 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index b0f4a3c4..8e85cc8e 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -1097,7 +1097,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x3, x1, &fixedaddress, rex, NULL, 1, 0); SRAIxw(x1, gd, 5+rex.w); // r1 = (gd>>5) - ADDSL(x3, wback, x1, 2+rex.w); + ADDSL(x3, wback, x1, 2+rex.w, x1); LDxw(x1, x3, fixedaddress); ed = x1; } @@ -1130,7 +1130,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x3, x1, &fixedaddress, rex, NULL, 1, 0); SRAI(x1, gd, 5+rex.w); - ADDSL(x3, wback, x1, 2+rex.w); + ADDSL(x3, wback, x1, 2+rex.w, x1); LDxw(x1, x3, fixedaddress); ed = x1; wback = x3; @@ -1277,7 +1277,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 1, 0); SRAI(x1, gd, 5+rex.w); - ADDSL(x3, wback, x1, 2+rex.w); + ADDSL(x3, wback, x1, 2+rex.w, x1); LDxw(x1, x3, fixedaddress); ed = x1; wback = x3; @@ -1446,7 +1446,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x3, x1, &fixedaddress, rex, NULL, 1, 0); SRAI(x1, gd, 5+rex.w); - ADDSL(x3, wback, x1, 2+rex.w); + ADDSL(x3, wback, x1, 2+rex.w, x1); LDxw(x1, x3, fixedaddress); ed = x1; wback = x3; diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index bb9d518e..1b89b08b 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -56,11 +56,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if (sib_reg!=4) { if(tmp && ((tmp<-2048) || (tmp>maxval) || !i12)) { MOV64x(scratch, tmp); - if((sib>>6)) { - ADDSL(ret, scratch, xRAX+sib_reg, sib>>6); - } else { - ADD(ret, xRAX+sib_reg, scratch); - } + ADDSL(ret, scratch, xRAX+sib_reg, sib>>6, ret); } else { if(sib>>6) { SLLI(ret, xRAX+sib_reg, (sib>>6)); @@ -77,11 +73,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, } } else { if (sib_reg!=4) { - if(sib>>6) { - ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6); - } else { - ADD(ret, xRAX+sib_reg2, xRAX+sib_reg); - } + ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6, scratch); } else { ret = xRAX+sib_reg2; } @@ -136,11 +128,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, *fixaddress = i64; if((nextop&7)==4) { if (sib_reg!=4) { - if(sib>>6) { - ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6); - } else { - ADD(ret, xRAX+sib_reg2, xRAX+sib_reg); - } + ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6, scratch); } else { ret = xRAX+sib_reg2; } @@ -150,11 +138,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if(i64>=-2048 && i64<=2047) { if((nextop&7)==4) { if (sib_reg!=4) { - if(sib>>6) { - ADDSL(scratch, xRAX+sib_reg2, xRAX+sib_reg, sib>>6); - } else { - ADD(scratch, xRAX+sib_reg2, xRAX+sib_reg); - } + ADDSL(scratch, xRAX+sib_reg2, xRAX+sib_reg, sib>>6, scratch); } else { scratch = xRAX+sib_reg2; } @@ -166,11 +150,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if((nextop&7)==4) { if (sib_reg!=4) { ADD(scratch, scratch, xRAX+sib_reg2); - if(sib>>6) { - ADDSL(ret, scratch, xRAX+sib_reg, sib>>6); - } else { - ADD(ret, scratch, xRAX+sib_reg); - } + ADDSL(ret, scratch, xRAX+sib_reg, sib>>6, ret); } else { PASS3(int tmp = xRAX+sib_reg2); ADD(ret, tmp, scratch); diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h index 2719a900..23f4f73d 100644 --- a/src/dynarec/rv64/rv64_emitter.h +++ b/src/dynarec/rv64/rv64_emitter.h @@ -310,15 +310,17 @@ f28–31 ft8–11 FP temporaries Caller // rd = rs1 + imm12 #define ADDIz(rd, rs1, imm12) EMIT(I_type((imm12)&0b111111111111, rs1, 0b000, rd, rex.is32bits?0b0011011:0b0010011)) -// rd = rs1 + (rs2 << imm2), rs2 might be used as scratch. -#define ADDSL(rd, rs1, rs2, imm2) if (rv64_zba) { \ - SHxADD(rd, rs2, imm2, rs1); \ - } else if (rv64_xtheadba) { \ - TH_ADDSL(rd, rs1, rs2, imm2); \ - } else { \ - SLLI(rs2, rs2, imm2); \ - ADD(rd, rs1, rs2); \ - } \ +// rd = rs1 + (rs2 << imm2) +#define ADDSL(rd, rs1, rs2, imm2, scratch) if (!imm2) { \ + ADD(rd, rs1, rs2); \ + } else if (rv64_zba) { \ + SHxADD(rd, rs2, imm2, rs1); \ + } else if (rv64_xtheadba) { \ + TH_ADDSL(rd, rs1, rs2, imm2); \ + } else { \ + SLLI(scratch, rs2, imm2); \ + ADD(rd, rs1, scratch); \ + } \ #define SEXT_W(rd, rs1) ADDIW(rd, rs1, 0) |