about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-19 22:09:43 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-19 22:09:43 +0100
commit7a056851d98db45584f0d978dc6567d4406be3df (patch)
tree209d87608cc33213225662fde4eda0c561b3cc21 /src
parent44eb9cf6788aff06b2e4fc536b86ef0458e7decf (diff)
downloadbox64-7a056851d98db45584f0d978dc6567d4406be3df.tar.gz
box64-7a056851d98db45584f0d978dc6567d4406be3df.zip
[DYNAREC] 0F A5 and 66 0F A4/A5 SHLD opcodes
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_0f.c12
-rwxr-xr-xsrc/dynarec/dynarec_arm64_660f.c19
2 files changed, 31 insertions, 0 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c
index 54e5f2d5..8e00682e 100755
--- a/src/dynarec/dynarec_arm64_0f.c
+++ b/src/dynarec/dynarec_arm64_0f.c
@@ -177,6 +177,18 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             BFIw(xFlags, x4, F_CF, 1);

             break;

 

+        case 0xA5:

+            nextop = F8;

+            INST_NAME("SHLD Ed, Gd, CL");

+            UXTBw(x3, xRCX);

+            SETFLAGS(X_ALL, SF_SET);

+            GETEDW(x4, x1, 0);

+            GETGD;

+            MOVxw_REG(x2, gd);

+            CALL_(rex.w?((void*)shld64):((void*)shld32), ed, x4);

+            WBACK;

+            break;

+

         case 0xAB:

             INST_NAME("BTS Ed, Gd");

             SETFLAGS(X_CF, SF_SET);

diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c
index e82d51ef..475bcab1 100755
--- a/src/dynarec/dynarec_arm64_660f.c
+++ b/src/dynarec/dynarec_arm64_660f.c
@@ -78,6 +78,25 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             LSRw_REG(x1, ed, x2);

             BFIw(xFlags, x1, F_CF, 1);

             break;

+        case 0xA4:

+        case 0xA5:

+            nextop = F8;

+            if(opcode==0xA4) {

+                INST_NAME("SHLD Ew, Gw, Ib");

+            } else {

+                INST_NAME("SHLD Ew, Gw, CL");

+                UXTBw(x3, xRCX);

+            }

+            SETFLAGS(X_ALL, SF_SET);

+            GETEWW(x4, x1, (opcode==0xA4)?1:0);

+            GETGW(x2);

+            if(opcode==0xA4) {

+                u8 = F8;

+                MOV32w(x3, u8);

+            }

+            CALL_(shld16, x1, wback);

+            EWBACKW(x1);

+            break;

 

         case 0xAB:

             INST_NAME("BTS Ew, Gw");