about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-09-12 07:46:13 +0000
committerYang Liu <liuyang22@iscas.ac.cn>2023-09-12 07:46:13 +0000
commitbe34e0221d12fbe55d59739cd86c628f45ffdf65 (patch)
tree93b2276eda6314d67cf3eef6d54018df1e3d1e72 /src
parent0913c94e46a138edb906bf4cb1e109519aff3bfe (diff)
downloadbox64-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.c44
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c10
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);