about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-03-05 16:09:50 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-03-05 16:09:50 +0100
commita63e840674222c6980fe683581b2f8b422441f3a (patch)
tree1929006559f6b0f632094fdb76a2b439bf68408f /src
parent0e9b61b3d87359ed275b2ec6338133b8a10e7a9f (diff)
downloadbox64-a63e840674222c6980fe683581b2f8b422441f3a.tar.gz
box64-a63e840674222c6980fe683581b2f8b422441f3a.zip
[DYNAREC] Added 64 0F B6 and 64 3B opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c
index b5542216..594bb7b5 100644
--- a/src/dynarec/arm64/dynarec_arm64_64.c
+++ b/src/dynarec/arm64/dynarec_arm64_64.c
@@ -203,6 +203,27 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     }
                     break;
 
+                case 0xB6:
+                    INST_NAME("MOVZX Gd, Eb");
+                    nextop = F8;
+                    grab_segdata(dyn, addr, ninst, x4, seg);
+                    GETGD;
+                    if(MODREG) {
+                        if(rex.rex) {
+                            eb1 = xRAX+(nextop&7)+(rex.b<<3);
+                            eb2 = 0;                \
+                        } else {
+                            ed = (nextop&7);
+                            eb1 = xRAX+(ed&3);  // Ax, Cx, Dx or Bx
+                            eb2 = (ed&4)>>2;    // L or H
+                        }
+                        UBFXxw(gd, eb1, eb2*8, 8);
+                    } else {
+                        addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, 0, 0);
+                        LDRB_REG(gd, ed, x4);
+                    }
+                    break;
+
                 default:
                     DEFAULT;
             }
@@ -228,6 +249,16 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             emit_cmp32(dyn, ninst, rex, ed, gd, x3, x4, x5);
             break;
 
+        case 0x3B:
+            INST_NAME("CMP Gd, Seg:Ed");
+            SETFLAGS(X_ALL, SF_SET_PENDING);
+            grab_segdata(dyn, addr, ninst, x4, seg);
+            nextop = F8;
+            GETGD;
+            GETEDO(x4, 0);
+            emit_cmp32(dyn, ninst, rex, gd, ed, x3, x4, x5);
+            break;
+
         case 0x63:
             INST_NAME("MOVSXD Gd, Ed");
             nextop = F8;