diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-09-12 07:46:13 +0000 |
|---|---|---|
| committer | Yang Liu <liuyang22@iscas.ac.cn> | 2023-09-12 07:46:13 +0000 |
| commit | be34e0221d12fbe55d59739cd86c628f45ffdf65 (patch) | |
| tree | 93b2276eda6314d67cf3eef6d54018df1e3d1e72 /src | |
| parent | 0913c94e46a138edb906bf4cb1e109519aff3bfe (diff) | |
| download | box64-be34e0221d12fbe55d59739cd86c628f45ffdf65.tar.gz box64-be34e0221d12fbe55d59739cd86c628f45ffdf65.zip | |
[DYNAREC_RV64] Added support for xtheadba
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 44 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 10 |
2 files changed, 43 insertions, 11 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index 9e225bd2..22062ce8 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -418,7 +418,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SRLI(x3, gd, 8); SLLI(x4, x2, 16); AND(x3, x3, x4); - OR(x1, x1, x3); + OR(x1, x1, x3); SLLI(x3, gd, 8); SLLI(x4, x2, 24); AND(x3, x3, x4); @@ -436,7 +436,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LUI(x2, 0xff0); AND(gd, gd, x2); OR(gd, gd, x1); - } + } } break; case 0xF1: @@ -477,7 +477,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SRLI(x3, gd, 8); SLLI(x4, x2, 16); AND(x3, x3, x4); - OR(x1, x1, x3); + OR(x1, x1, x3); SLLI(x3, gd, 8); SLLI(x4, x2, 24); AND(x3, x3, x4); @@ -1097,8 +1097,14 @@ 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) - SLLI(x1, x1, 2+rex.w); - ADD(x3, wback, x1); //(&ed)+=r1*4; + if (rv64_zba) { + SHxADD(x3, x1, 2+rex.w, wback); + } else if (rv64_xtheadba) { + TH_ADDSL(x3, wback, x1, 2+rex.w); + } else { + SLLI(x1, x1, 2+rex.w); + ADD(x3, wback, x1); + } LDxw(x1, x3, fixedaddress); ed = x1; } @@ -1131,8 +1137,14 @@ 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); - SLLI(x1, x1, 2+rex.w); - ADD(x3, wback, x1); + if (rv64_zba) { + SHxADD(x3, x1, 2+rex.w, wback); + } else if (rv64_xtheadba) { + TH_ADDSL(x3, wback, x1, 2+rex.w); + } else { + SLLI(x1, x1, 2+rex.w); + ADD(x3, wback, x1); + } LDxw(x1, x3, fixedaddress); ed = x1; wback = x3; @@ -1279,8 +1291,14 @@ 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); - SLLI(x1, x1, 2+rex.w); - ADD(x3, wback, x1); + if (rv64_zba) { + SHxADD(x3, x1, 2+rex.w, wback); + } else if (rv64_xtheadba) { + TH_ADDSL(x3, wback, x1, 2+rex.w); + } else { + SLLI(x1, x1, 2+rex.w); + ADD(x3, wback, x1); + } LDxw(x1, x3, fixedaddress); ed = x1; wback = x3; @@ -1449,8 +1467,12 @@ 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); - SLLI(x1, x1, 2+rex.w); - ADD(x3, wback, x1); + if (rv64_xtheadba) { + TH_ADDSL(x3, wback, x1, 2+rex.w); + } else { + SLLI(x1, x1, 2+rex.w); + ADD(x3, wback, 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 a005c3b9..f42ea2a1 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -59,6 +59,8 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if((sib>>6)) { if(rv64_zba) { SHxADD(ret, xRAX+sib_reg, sib>>6, scratch); + } else if (rv64_xtheadba) { + TH_ADDSL(ret, scratch, xRAX+sib_reg, sib>>6); } else { SLLI(ret, xRAX+sib_reg, (sib>>6)); ADD(ret, ret, scratch); @@ -85,6 +87,8 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if(sib>>6) { if(rv64_zba) { SHxADD(ret, xRAX+sib_reg, sib>>6, xRAX+sib_reg2); + } else if (rv64_xtheadba) { + TH_ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6); } else { SLLI(scratch, xRAX+sib_reg, (sib>>6)); ADD(ret, xRAX+sib_reg2, scratch); @@ -149,6 +153,8 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if(sib>>6) { if(rv64_zba) { SHxADD(ret, xRAX+sib_reg, sib>>6, xRAX+sib_reg2); + } else if (rv64_xtheadba) { + TH_ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6); } else { SLLI(scratch, xRAX+sib_reg, (sib>>6)); ADD(ret, xRAX+sib_reg2, scratch); @@ -168,6 +174,8 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if(sib>>6) { if(rv64_zba) { SHxADD(scratch, xRAX+sib_reg, sib>>6, xRAX+sib_reg2); + } else if (rv64_xtheadba) { + TH_ADDSL(scratch, xRAX+sib_reg2, xRAX+sib_reg, sib>>6); } else { SLLI(scratch, xRAX+sib_reg, (sib>>6)); ADD(scratch, xRAX+sib_reg2, scratch); @@ -189,6 +197,8 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop, if(sib>>6) { if(rv64_zba) { SHxADD(ret, xRAX+sib_reg, sib>>6, scratch); + } else if (rv64_xtheadba) { + TH_ADDSL(ret, scratch, xRAX+sib_reg, sib>>6); } else { SLLI(ret, xRAX+sib_reg, (sib>>6)); ADD(ret, scratch, ret); |