about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-09-08 11:54:42 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-09-08 11:54:42 +0200
commit6f144aa429e67721582bd8f02170ee90fe3fafa9 (patch)
tree5aff488e4421fc38df0432a0f8d5d9c6fa4d3b8d
parente5c1e3a2a26036c73e076bb4c7151f7c7d9d150b (diff)
downloadbox64-6f144aa429e67721582bd8f02170ee90fe3fafa9.tar.gz
box64-6f144aa429e67721582bd8f02170ee90fe3fafa9.zip
[ARM64_DYNAREC] A few minor fixes to some opcodes
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c5
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c40
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67_32.c4
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c6
5 files changed, 26 insertions, 31 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index e362899b..a513c8ee 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -2722,6 +2722,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     if ((BOX64ENV(log)<2 && !BOX64ENV(rolling_log) && !BOX64ENV(dynarec_test)) && tmp) {
                         //GETIP(ip+3+8+8); // read the 0xCC
                         call_n(dyn, ninst, (void*)(addr+8), tmp);
+                        SMWRITE2();
                         addr+=8+8;
                     } else {
                         GETIP(ip+1); // read the 0xCC
@@ -3442,6 +3443,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0xE0:
             INST_NAME("LOOPNZ");
             READFLAGS(X_ZF);
+            SMEND();
             i8 = F8S;
             SUBz_U12(xRCX, xRCX, 1);
             TBNZ_NEXT(xFlags, F_ZF);
@@ -3450,6 +3452,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0xE1:
             INST_NAME("LOOPZ");
             READFLAGS(X_ZF);
+            SMEND();
             i8 = F8S;
             SUBz_U12(xRCX, xRCX, 1);
             TBZ_NEXT(xFlags, F_ZF);
@@ -3462,7 +3465,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             GO(0);
             break;
         case 0xE3:
-            INST_NAME("JECXZ");
+            INST_NAME("JRCXZ");
             i8 = F8S;
             GO(1);
             break;
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index 5200e5b7..800a2091 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -905,10 +905,10 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                         REV16x(x1, gd);

                         BFIx(ed, x1, 0, 16);

                     } else {

-                        SMREAD();

                         addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<1, (1<<1)-1, rex, NULL, 0, 0);

                         REV16x(x1, gd);

                         STH(x1, ed, fixedaddress);

+                        SMWRITE();

                     }

                     break;

 

diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c
index 05b18944..793fa503 100644
--- a/src/dynarec/arm64/dynarec_arm64_67.c
+++ b/src/dynarec/arm64/dynarec_arm64_67.c
@@ -1432,65 +1432,57 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             break;

 

 

-        #define GO(NO, YES)                                             \

+        #define GO(Z)                                                   \

             JUMP(addr+i8, 1);                                           \

             if(dyn->insts[ninst].x64.jmp_insts==-1 ||                   \

                 CHECK_CACHE()) {                                        \

                 /* out of the block */                                  \

                 i32 = dyn->insts[ninst].epilog-(dyn->native_size);      \

-                Bcond(NO, i32);                                         \

+                if(Z) {CBNZw(xRCX, i32);} else {CBZw(xRCX, i32);};      \

                 if(dyn->insts[ninst].x64.jmp_insts==-1) {               \

                     if(!(dyn->insts[ninst].x64.barrier&BARRIER_FLOAT))  \

                         fpu_purgecache(dyn, ninst, 1, x1, x2, x3);      \

                     jump_to_next(dyn, addr+i8, 0, ninst, rex.is32bits); \

                 } else {                                                \

                     CacheTransform(dyn, ninst, cacheupd);               \

-                    i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size);\

+                    i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size);    \

                     SKIP_SEVL(i32);                                     \

-                    B(i32);                                             \

+                    Bcond(c__, i32);                                    \

                 }                                                       \

             } else {                                                    \

                 /* inside the block */                                  \

                 i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size);    \

                 SKIP_SEVL(i32);                                         \

-                Bcond(YES, i32);                                        \

+                if(Z) {CBZw(xRCX, i32);} else {CBNZw(xRCX, i32);};      \

             }

         case 0xE0:

             INST_NAME("LOOPNZ (32bits)");

             READFLAGS(X_ZF);

+            SMEND();

             i8 = F8S;

-            MOVw_REG(x1, xRCX);

-            SUBw_U12(x1, x1, 1);

-            BFIx(xRCX, x1, 0, 32);

-            CBZw_NEXT(x1);    // ECX is 0, no LOOP

-            TSTw_mask(xFlags, 0b011010, 0); //mask=0x40

-            GO(cNE, cEQ);

+            SUBw_U12(xRCX, xRCX, 1);

+            TBNZ_NEXT(xFlags, F_ZF);

+            GO(0);

             break;

         case 0xE1:

             INST_NAME("LOOPZ (32bits)");

             READFLAGS(X_ZF);

+            SMEND();

             i8 = F8S;

-            MOVw_REG(x1, xRCX);

-            SUBw_U12(x1, x1, 1);

-            BFIx(xRCX, x1, 0, 32);

-            CBZw_NEXT(x1);    // ECX is 0, no LOOP

-            TSTw_mask(xFlags, 0b011010, 0); //mask=0x40

-            GO(cEQ, cNE);

+            SUBw_U12(xRCX, xRCX, 1);

+            TBZ_NEXT(xFlags, F_ZF);

+            GO(0);

             break;

         case 0xE2:

             INST_NAME("LOOP (32bits)");

             i8 = F8S;

-            MOVw_REG(x1, xRCX);

-            SUBSw_U12(x1, x1, 1);

-            BFIx(xRCX, x1, 0, 32);

-            GO(cEQ, cNE);

+            SUBw_U12(xRCX, xRCX, 1);

+            GO(0);

             break;

         case 0xE3:

             INST_NAME("JECXZ");

             i8 = F8S;

-            MOVw_REG(x1, xRCX);

-            TSTw_REG(x1, x1);

-            GO(cNE, cEQ);

+            GO(1);

             break;

         #undef GO

 

diff --git a/src/dynarec/arm64/dynarec_arm64_67_32.c b/src/dynarec/arm64/dynarec_arm64_67_32.c
index bb394e71..58ec2ee8 100644
--- a/src/dynarec/arm64/dynarec_arm64_67_32.c
+++ b/src/dynarec/arm64/dynarec_arm64_67_32.c
@@ -115,6 +115,7 @@ uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
             INST_NAME("LOOPNZ (16bits)");
             READFLAGS(X_ZF);
             i8 = F8S;
+            SMEND();
             UXTHw(x1, xRCX);
             SUBw_U12(x1, x1, 1);
             BFIx(xRCX, x1, 0, 16);
@@ -125,6 +126,7 @@ uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
         case 0xE1:
             INST_NAME("LOOPZ (16bits)");
             READFLAGS(X_ZF);
+            SMEND();
             i8 = F8S;
             UXTHw(x1, xRCX);
             SUBw_U12(x1, x1, 1);
@@ -136,6 +138,7 @@ uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
         case 0xE2:
             INST_NAME("LOOP (16bits)");
             i8 = F8S;
+            SMEND();
             UXTHw(x1, xRCX);
             SUBSw_U12(x1, x1, 1);
             BFIx(xRCX, x1, 0, 16);
@@ -144,6 +147,7 @@ uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
         case 0xE3:
             INST_NAME("JCXZ");
             i8 = F8S;
+            SMEND();
             TSTw_mask(xRCX, 0, 15); //mask=0xffff
             GO(cNE, cEQ);
             break;
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
index dae8dbac..e4435717 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
@@ -378,7 +378,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             if(MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
             } else {
-                SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff, 0, rex, NULL, 0, 1);
                 ed = x1;
             }
@@ -396,7 +395,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             if(MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
             } else {
-                SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<1, 1, rex, NULL, 0, 1);
                 ed = x1;
             }
@@ -414,7 +412,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             if(MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
             } else {
-                SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 1);
                 ed = x1;
             }
@@ -436,7 +433,6 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             if(MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
             } else {
-                SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 1);
                 ed = x1;
             }
@@ -497,7 +493,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             break;
 
         case 0x1D:
-            INST_NAME("VCVTPS2PH Ex, Gx");
+            INST_NAME("VCVTPS2PH Ex, Gx, Ib");
             nextop = F8;
             GETGX(v0, 0);
             if(MODREG) {