about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-01-09 15:20:55 +0800
committerGitHub <noreply@github.com>2024-01-09 08:20:55 +0100
commit16de80f46a20d9e2ab5efbe4eb14c67303079d40 (patch)
tree303e39ee52c202a1418c49cdaec5df49c8901d12
parent294bc51f8353ce670082c28cf5df3aa45c9ed86a (diff)
downloadbox64-16de80f46a20d9e2ab5efbe4eb14c67303079d40.tar.gz
box64-16de80f46a20d9e2ab5efbe4eb14c67303079d40.zip
[DYNAREC_RV64] Fixed a wrong Zba optimization (#1193)
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c
index 2e887b84..9a12f1e4 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.c
+++ b/src/dynarec/rv64/dynarec_rv64_helper.c
@@ -191,7 +191,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
                     if(tmp && ((tmp<-2048) || (tmp>maxval) || !i12)) {
                         MOV32w(scratch, tmp);
                         if((sib>>6)) {
-                            if(rv64_zba) SHxADDUW(ret, xRAX+sib_reg, (sib>>6), scratch); else {SLLI(ret, xRAX+sib_reg, sib>>6); ADDW(ret, ret, scratch);}
+                            SLLI(ret, xRAX + sib_reg, sib >> 6);
+                            ADDW(ret, ret, scratch);
                         } else
                             ADDW(ret, xRAX+sib_reg, scratch);
                     } else {
@@ -211,7 +212,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
             } else {
                 if (sib_reg!=4) {
                     if((sib>>6)) {
-                        if(rv64_zba) SHxADDUW(ret, xRAX+sib_reg, (sib>>6), xRAX+sib_reg2); else { SLLI(ret, xRAX+sib_reg, (sib>>6)); ADDW(ret, ret, xRAX+sib_reg2);}
+                        SLLI(ret, xRAX + sib_reg, (sib >> 6));
+                        ADDW(ret, ret, xRAX + sib_reg2);
                     } else
                         ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg);
                 } else {
@@ -249,7 +251,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
             if((nextop&7)==4) {
                 if (sib_reg!=4) {
                     if(sib>>6) {
-                    if(rv64_zba) SHxADDUW(ret, xRAX+sib_reg, (sib>>6), xRAX+sib_reg2); else {SLLI(ret, xRAX+sib_reg, (sib>>6)); ADDW(ret, ret, xRAX+sib_reg2);}
+                        SLLI(ret, xRAX + sib_reg, (sib >> 6));
+                        ADDW(ret, ret, xRAX + sib_reg2);
                     } else
                         ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg);
                 } else {
@@ -263,7 +266,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
                 if((nextop&7)==4) {
                     if (sib_reg!=4) {
                         if(sib>>6) {
-                            if(rv64_zba) SHxADDUW(scratch, xRAX+sib_reg, (sib>>6), xRAX+sib_reg2); else {SLLI(scratch, xRAX+sib_reg, sib>>6); ADDW(scratch, scratch, xRAX+sib_reg2);}
+                            SLLI(scratch, xRAX + sib_reg, sib >> 6);
+                            ADDW(scratch, scratch, xRAX + sib_reg2);
                         } else
                             ADDW(scratch, xRAX+sib_reg2, xRAX+sib_reg);
                     } else {
@@ -278,7 +282,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
                     if (sib_reg!=4) {
                         ADDW(scratch, scratch, xRAX+sib_reg2);
                         if(sib>>6) {
-                            if(rv64_zba) SHxADDUW(ret, xRAX+sib_reg, (sib>>6), scratch); else {SLLI(ret, xRAX+sib_reg, (sib>>6)); ADDW(ret, ret, scratch);}
+                            SLLI(ret, xRAX + sib_reg, (sib >> 6));
+                            ADDW(ret, ret, scratch);
                         } else
                             ADDW(ret, scratch, xRAX+sib_reg);
                     } else {
@@ -322,7 +327,8 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
                     if(tmp && ((tmp<-2048) || (tmp>maxval) || !i12)) {
                         MOV64x(scratch, tmp);
                         if((sib>>6)) {
-                            if(rv64_zba) SHxADDUW(ret, xRAX+sib_reg, (sib>>6), scratch); else {SLLI(ret, xRAX+sib_reg, sib>>6); ADDW(ret, ret, scratch);}
+                            SLLI(ret, xRAX + sib_reg, sib >> 6);
+                            ADDW(ret, ret, scratch);
                         } else
                             ADDW(ret, xRAX+sib_reg, scratch);
                     } else {
@@ -342,7 +348,8 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
             } else {
                 if (sib_reg!=4) {
                     if((sib>>6)) {
-                        if(rv64_zba) SHxADDUW(ret, xRAX+sib_reg, (sib>>6), xRAX+sib_reg2); else { SLLI(ret, xRAX+sib_reg, (sib>>6)); ADDW(ret, ret, xRAX+sib_reg2);}
+                        SLLI(ret, xRAX + sib_reg, (sib >> 6));
+                        ADDW(ret, ret, xRAX + sib_reg2);
                     } else
                         ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg);
                 } else {
@@ -382,7 +389,8 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
             if((nextop&7)==4) {
                 if (sib_reg!=4) {
                     if(sib>>6) {
-                    if(rv64_zba) SHxADDUW(ret, xRAX+sib_reg, (sib>>6), xRAX+sib_reg2); else {SLLI(ret, xRAX+sib_reg, (sib>>6)); ADDW(ret, ret, xRAX+sib_reg2);}
+                        SLLI(ret, xRAX + sib_reg, (sib >> 6));
+                        ADDW(ret, ret, xRAX + sib_reg2);
                     } else
                         ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg);
                 } else {
@@ -396,7 +404,8 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
                 if((nextop&7)==4) {
                     if (sib_reg!=4) {
                         if(sib>>6) {
-                            if(rv64_zba) SHxADDUW(scratch, xRAX+sib_reg, (sib>>6), xRAX+sib_reg2); else {SLLI(scratch, xRAX+sib_reg, sib>>6); ADDW(scratch, scratch, xRAX+sib_reg2);}
+                            SLLI(scratch, xRAX + sib_reg, sib >> 6);
+                            ADDW(scratch, scratch, xRAX + sib_reg2);
                         } else
                             ADDW(scratch, xRAX+sib_reg2, xRAX+sib_reg);
                     } else {
@@ -411,7 +420,8 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
                     if (sib_reg!=4) {
                         ADDW(scratch, scratch, xRAX+sib_reg2);
                         if(sib>>6) {
-                            if(rv64_zba) SHxADDUW(ret, xRAX+sib_reg, (sib>>6), scratch); else {SLLI(ret, xRAX+sib_reg, (sib>>6)); ADDW(ret, ret, scratch);}
+                            SLLI(ret, xRAX + sib_reg, (sib >> 6));
+                            ADDW(ret, ret, scratch);
                         } else
                             ADDW(ret, scratch, xRAX+sib_reg);
                     } else {