about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-05-21 10:05:36 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-05-21 10:05:36 +0200
commit4be307820bab87e8bcd219b95ac0f5cb9b3acc3e (patch)
tree585bde0dee77a5af8a1ffa2ab91176ac0ef82c3d /src
parent15227bbc0651b7e16ef082435932eb085c3a9ea4 (diff)
downloadbox64-4be307820bab87e8bcd219b95ac0f5cb9b3acc3e.tar.gz
box64-4be307820bab87e8bcd219b95ac0f5cb9b3acc3e.zip
Added 64 80 opcodes ([DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/dynarec_arm64_64.c82
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.h31
-rw-r--r--src/emu/x64run64.c16
3 files changed, 114 insertions, 15 deletions
diff --git a/src/dynarec/dynarec_arm64_64.c b/src/dynarec/dynarec_arm64_64.c
index d6245467..077411ce 100644
--- a/src/dynarec/dynarec_arm64_64.c
+++ b/src/dynarec/dynarec_arm64_64.c
@@ -31,11 +31,13 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     uint8_t nextop;
     uint8_t u8;
     uint8_t gd, ed, eb1, eb2;
-    uint8_t wback;
+    uint8_t wback, wb1, wb2;
     int64_t i64, j64;
     int64_t fixedaddress;
     MAYUSE(eb1);
     MAYUSE(eb2);
+    MAYUSE(wb1);
+    MAYUSE(wb2);
     MAYUSE(j64);
 
     while((opcode==0xF2) || (opcode==0xF3)) {
@@ -71,6 +73,84 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             emit_xor32(dyn, ninst, rex, gd, ed, x3, x4);
             break;
                     
+        case 0x80:
+            nextop = F8;
+            grab_segdata(dyn, addr, ninst, x1, _FS);
+            switch((nextop>>3)&7) {
+                case 0: //ADD
+                    INST_NAME("ADD Eb, Ib");
+                    SETFLAGS(X_ALL, SF_SET);
+                    GETEBO(x1, 1);
+                    u8 = F8;
+                    emit_add8c(dyn, ninst, x1, u8, x2, x4);
+                    EBBACK;
+                    break;
+                case 1: //OR
+                    INST_NAME("OR Eb, Ib");
+                    SETFLAGS(X_ALL, SF_SET);
+                    GETEBO(x1, 1);
+                    u8 = F8;
+                    emit_or8c(dyn, ninst, x1, u8, x2, x4);
+                    EBBACK;
+                    break;
+                case 2: //ADC
+                    INST_NAME("ADC Eb, Ib");
+                    READFLAGS(X_CF);
+                    SETFLAGS(X_ALL, SF_SET);
+                    GETEBO(x1, 1);
+                    u8 = F8;
+                    emit_adc8c(dyn, ninst, x1, u8, x2, x4, x5);
+                    EBBACK;
+                    break;
+                case 3: //SBB
+                    INST_NAME("SBB Eb, Ib");
+                    READFLAGS(X_CF);
+                    SETFLAGS(X_ALL, SF_SET);
+                    GETEBO(x1, 1);
+                    u8 = F8;
+                    emit_sbb8c(dyn, ninst, x1, u8, x2, x4, x5);
+                    EBBACK;
+                    break;
+                case 4: //AND
+                    INST_NAME("AND Eb, Ib");
+                    SETFLAGS(X_ALL, SF_SET);
+                    GETEBO(x1, 1);
+                    u8 = F8;
+                    emit_and8c(dyn, ninst, x1, u8, x2, x4);
+                    EBBACK;
+                    break;
+                case 5: //SUB
+                    INST_NAME("SUB Eb, Ib");
+                    SETFLAGS(X_ALL, SF_SET);
+                    GETEBO(x1, 1);
+                    u8 = F8;
+                    emit_sub8c(dyn, ninst, x1, u8, x2, x4, x5);
+                    EBBACK;
+                    break;
+                case 6: //XOR
+                    INST_NAME("XOR Eb, Ib");
+                    SETFLAGS(X_ALL, SF_SET);
+                    GETEBO(x1, 1);
+                    u8 = F8;
+                    emit_xor8c(dyn, ninst, x1, u8, x2, x4);
+                    EBBACK;
+                    break;
+                case 7: //CMP
+                    INST_NAME("CMP Eb, Ib");
+                    SETFLAGS(X_ALL, SF_SET);
+                    GETEBO(x1, 1);
+                    u8 = F8;
+                    if(u8) {
+                        MOV32w(x2, u8);
+                        emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);
+                    } else {
+                        emit_cmp8_0(dyn, ninst, x1, x3, x4);
+                    }
+                    break;
+                default:
+                    DEFAULT;
+            }
+            break;
         case 0x81:
         case 0x83:
             nextop = F8;
diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h
index dfa6f4ce..338a1cad 100755
--- a/src/dynarec/dynarec_arm64_helper.h
+++ b/src/dynarec/dynarec_arm64_helper.h
@@ -166,19 +166,24 @@
                     ed = i;                     \
                 }
 //GETEBO will use i for ed, i is also Offset, and can use r3 for wback.
-#define GETEBO(i) if((nextop&0xC0)==0xC0) {  \
-                    wback = (nextop&7);     \
-                    wb2 = (wback>>2);       \
-                    wback = xEAX+(wback&3); \
-                    UBFXx(i, wback, wb2, 8);\
-                    wb1 = 0;                \
-                    ed = i;                 \
-                } else {                    \
-                    addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0); \
-                    ADD_REG_LSL_IMM5(wback, wback, i, 0);   \
-                    LDRB_IMM9(i, wback, fixedaddress);      \
-                    wb1 = 1;                \
-                    ed = i;                 \
+#define GETEBO(i, D) if(MODREG) {               \
+                    if(rex.rex) {               \
+                        wback = xRAX+(nextop&7)+(rex.b<<3);     \
+                        wb2 = 0;                \
+                    } else {                    \
+                        wback = (nextop&7);     \
+                        wb2 = (wback>>2)*8;     \
+                        wback = xRAX+(wback&3); \
+                    }                           \
+                    UBFXx(i, wback, wb2, 8);    \
+                    wb1 = 0;                    \
+                    ed = i;                     \
+                } else {                        \
+                    addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0, rex, 0, D); \
+                    ADDx_REG(wback, wback, i);  \
+                    LDRB_U12(i, wback, fixedaddress);      \
+                    wb1 = 1;                    \
+                    ed = i;                     \
                 }
 //GETSEB sign extend EB, will use i for ed, and can use r3 for wback.
 #define GETSEB(i, D) if(MODREG) {                \
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index ae4dbe63..3b6bb4f2 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -217,7 +217,21 @@ int Run64(x64emu_t *emu, rex_t rex)
             }

             break;

 

-

+        case 0x80:                      /* GRP Eb,Ib */

+            nextop = F8;

+            GETEB_OFFS(1, tlsdata);

+            tmp8u = F8;

+            switch((nextop>>3)&7) {

+                case 0: EB->byte[0] = add8(emu, EB->byte[0], tmp8u); break;

+                case 1: EB->byte[0] =  or8(emu, EB->byte[0], tmp8u); break;

+                case 2: EB->byte[0] = adc8(emu, EB->byte[0], tmp8u); break;

+                case 3: EB->byte[0] = sbb8(emu, EB->byte[0], tmp8u); break;

+                case 4: EB->byte[0] = and8(emu, EB->byte[0], tmp8u); break;

+                case 5: EB->byte[0] = sub8(emu, EB->byte[0], tmp8u); break;

+                case 6: EB->byte[0] = xor8(emu, EB->byte[0], tmp8u); break;

+                case 7:               cmp8(emu, EB->byte[0], tmp8u); break;

+            }

+            break;

         case 0x81:                      /* GRP Ed,Id */

         case 0x83:                      /* GRP Ed,Ib */

             nextop = F8;