about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-07 17:40:48 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-07 17:40:48 +0100
commit3cc9d47032cb14de9144284be4cca9ab9e6749ee (patch)
treed79be38b1306159d0d4662b155c5fa3ac782b4eb /src/dynarec
parent128708db2d6fe99ba0fe25978316eec4b2088774 (diff)
downloadbox64-3cc9d47032cb14de9144284be4cca9ab9e6749ee.tar.gz
box64-3cc9d47032cb14de9144284be4cca9ab9e6749ee.zip
Added some weird 67 and 64/65 prefixed opcodes ([ARM64_DYNAREC] too)
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c35
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c53
2 files changed, 88 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c
index 09576603..28078fc6 100644
--- a/src/dynarec/arm64/dynarec_arm64_64.c
+++ b/src/dynarec/arm64/dynarec_arm64_64.c
@@ -436,6 +436,25 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             emit_cmp32(dyn, ninst, rex, gd, ed, x3, x4, x5);
             break;
 
+        case 0x50:
+        case 0x51:
+        case 0x52:
+        case 0x53:
+        case 0x54:
+        case 0x55:
+        case 0x56:
+        case 0x57:
+        case 0x58:
+        case 0x59:
+        case 0x5A:
+        case 0x5B:
+        case 0x5C:
+        case 0x5D:
+        case 0x5E:
+        case 0x5F:
+            // just use regular conditional jump
+            return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog);
+
         case 0x63:
             if(rex.is32bits) {
                 // ARPL here
@@ -948,6 +967,22 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             INST_NAME("NOP");
             break;
 
+        case 0x9D:
+            INST_NAME("POPF");
+            SETFLAGS(X_ALL, SF_SET);
+            POP1z(xFlags);
+            MOV32w(x1, 0x3F7FD7);
+            ANDw_REG(xFlags, xFlags, x1);
+            MOV32w(x1, 0x202);
+            ORRw_REG(xFlags, xFlags, x1);
+            SET_DFNONE(x1);
+            if(box64_wine) {    // should this be done all the time?
+                TBZ_NEXT(xFlags, F_TF);
+                // go to epilog, TF should trigger at end of next opcode, so using Interpreter only
+                jump_to_epilog(dyn, addr, 0, ninst);
+            }
+            break;
+
         case 0xA1:
             INST_NAME("MOV EAX,FS:Od");
             grab_segdata(dyn, addr, ninst, x4, seg);
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c
index 358825c1..e5a4e613 100644
--- a/src/dynarec/arm64/dynarec_arm64_67.c
+++ b/src/dynarec/arm64/dynarec_arm64_67.c
@@ -682,6 +682,25 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 emit_cmp32_0(dyn, ninst, rex, xRAX, x3, x4);

             break;

 

+        case 0x50:

+        case 0x51:

+        case 0x52:

+        case 0x53:

+        case 0x54:

+        case 0x55:

+        case 0x56:

+        case 0x57:

+        case 0x58:

+        case 0x59:

+        case 0x5A:

+        case 0x5B:

+        case 0x5C:

+        case 0x5D:

+        case 0x5E:

+        case 0x5F:

+            // just use regular conditional jump

+            return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog);

+

         case 0x63:

             INST_NAME("MOVSXD Gd, Ed");

             nextop = F8;

@@ -713,6 +732,21 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 case 0x0F:

                     nextop = F8;

                     switch(nextop) {

+                        case 0x6F:

+                            INST_NAME("MOVDQA Gx,Ex");

+                            nextop = F8;

+                            if(MODREG) {

+                                v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);

+                                GETGX_empty(v0);

+                                VMOVQ(v0, v1);

+                            } else {

+                                GETGX_empty(v0);

+                                SMREAD();

+                                addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);

+                                VLD128(v0, ed, fixedaddress);

+                            }

+                            break;

+

                         case 0x7E:

                             INST_NAME("MOVD Ed,Gx");

                             nextop = F8;

@@ -919,6 +953,25 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             }

             break;

 

+        case 0x70:

+        case 0x71:

+        case 0x72:

+        case 0x73:

+        case 0x74:

+        case 0x75:

+        case 0x76:

+        case 0x77:

+        case 0x78:

+        case 0x79:

+        case 0x7A:

+        case 0x7B:

+        case 0x7C:

+        case 0x7D:

+        case 0x7E:

+        case 0x7F:

+            // just use regular conditional jump

+            return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog);

+

         case 0x81:

         case 0x83:

             nextop = F8;