about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-26 11:03:32 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-26 11:03:32 +0200
commitda7474b1de99c3952f9b1c67275e7a5bf44e7121 (patch)
tree6d041d3b70d10f0ffbe6acf76f8ed6bd3407af43 /src
parent27aa9011ce0b83428dad48d96d66135d7301c236 (diff)
downloadbox64-da7474b1de99c3952f9b1c67275e7a5bf44e7121.tar.gz
box64-da7474b1de99c3952f9b1c67275e7a5bf44e7121.zip
Added 67 66 83 opcodes ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c83
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.h13
-rw-r--r--src/emu/x64run6766.c23
3 files changed, 119 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c
index b7392210..b22c7f92 100644
--- a/src/dynarec/arm64/dynarec_arm64_67.c
+++ b/src/dynarec/arm64/dynarec_arm64_67.c
@@ -37,6 +37,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     uint8_t u8;

     int32_t i32;

     int64_t j64, i64;

+    int16_t i16;

     int cacheupd = 0;

     int lock;

     int v0, v1, s0;

@@ -679,6 +680,88 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     }

                     break;

 

+                    case 0x81:

+                    case 0x83:

+                        nextop = F8;

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

+                            case 0: //ADD

+                                if(opcode==0x81) {INST_NAME("ADD Ew, Iw");} else {INST_NAME("ADD Ew, Ib");}

+                                SETFLAGS(X_ALL, SF_SET_PENDING);

+                                GETEW32(x1, (opcode==0x81)?2:1);

+                                if(opcode==0x81) i16 = F16S; else i16 = F8S;

+                                MOVZw(x5, i16);

+                                emit_add16(dyn, ninst, ed, x5, x2, x4);

+                                EWBACK;

+                                break;

+                            case 1: //OR

+                                if(opcode==0x81) {INST_NAME("OR Ew, Iw");} else {INST_NAME("OR Ew, Ib");}

+                                SETFLAGS(X_ALL, SF_SET_PENDING);

+                                GETEW32(x1, (opcode==0x81)?2:1);

+                                if(opcode==0x81) i16 = F16S; else i16 = F8S;

+                                MOVZw(x5, i16);

+                                emit_or16(dyn, ninst, x1, x5, x2, x4);

+                                EWBACK;

+                                break;

+                            case 2: //ADC

+                                if(opcode==0x81) {INST_NAME("ADC Ew, Iw");} else {INST_NAME("ADC Ew, Ib");}

+                                READFLAGS(X_CF);

+                                SETFLAGS(X_ALL, SF_SET_PENDING);

+                                GETEW32(x1, (opcode==0x81)?2:1);

+                                if(opcode==0x81) i16 = F16S; else i16 = F8S;

+                                MOVZw(x5, i16);

+                                emit_adc16(dyn, ninst, x1, x5, x2, x4);

+                                EWBACK;

+                                break;

+                            case 3: //SBB

+                                if(opcode==0x81) {INST_NAME("SBB Ew, Iw");} else {INST_NAME("SBB Ew, Ib");}

+                                READFLAGS(X_CF);

+                                SETFLAGS(X_ALL, SF_SET_PENDING);

+                                GETEW32(x1, (opcode==0x81)?2:1);

+                                if(opcode==0x81) i16 = F16S; else i16 = F8S;

+                                MOVZw(x5, i16);

+                                emit_sbb16(dyn, ninst, x1, x5, x2, x4);

+                                EWBACK;

+                                break;

+                            case 4: //AND

+                                if(opcode==0x81) {INST_NAME("AND Ew, Iw");} else {INST_NAME("AND Ew, Ib");}

+                                SETFLAGS(X_ALL, SF_SET_PENDING);

+                                GETEW32(x1, (opcode==0x81)?2:1);

+                                if(opcode==0x81) i16 = F16S; else i16 = F8S;

+                                MOVZw(x5, i16);

+                                emit_and16(dyn, ninst, x1, x5, x2, x4);

+                                EWBACK;

+                                break;

+                            case 5: //SUB

+                                if(opcode==0x81) {INST_NAME("SUB Ew, Iw");} else {INST_NAME("SUB Ew, Ib");}

+                                SETFLAGS(X_ALL, SF_SET_PENDING);

+                                GETEW32(x1, (opcode==0x81)?2:1);

+                                if(opcode==0x81) i16 = F16S; else i16 = F8S;

+                                MOVZw(x5, i16);

+                                emit_sub16(dyn, ninst, x1, x5, x2, x4);

+                                EWBACK;

+                                break;

+                            case 6: //XOR

+                                if(opcode==0x81) {INST_NAME("XOR Ew, Iw");} else {INST_NAME("XOR Ew, Ib");}

+                                SETFLAGS(X_ALL, SF_SET_PENDING);

+                                GETEW32(x1, (opcode==0x81)?2:1);

+                                if(opcode==0x81) i16 = F16S; else i16 = F8S;

+                                MOVZw(x5, i16);

+                                emit_xor16(dyn, ninst, x1, x5, x2, x4);

+                                EWBACK;

+                                break;

+                            case 7: //CMP

+                                if(opcode==0x81) {INST_NAME("CMP Ew, Iw");} else {INST_NAME("CMP Ew, Ib");}

+                                SETFLAGS(X_ALL, SF_SET_PENDING);

+                                GETEW32(x1, (opcode==0x81)?2:1);

+                                if(opcode==0x81) i16 = F16S; else i16 = F8S;

+                                if(i16) {

+                                    MOVZw(x2, i16);

+                                    emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5);

+                                } else

+                                    emit_cmp16_0(dyn, ninst, x1, x3, x4);

+                                break;

+                        }

+                        break;

                 case 0x89:

                     INST_NAME("MOV Ew, Gw");

                     nextop = F8;

diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h
index 345ce432..96c56be8 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.h
+++ b/src/dynarec/arm64/dynarec_arm64_helper.h
@@ -280,6 +280,19 @@
                     ed = i;                 \
                     wb1 = 1;                \
                 }
+//GETEW will use i for ed, and can use r3 for wback.
+#define GETEW32(i, D) if(MODREG) {          \
+                    wback = xRAX+(nextop&7)+(rex.b<<3);\
+                    UXTHw(i, wback);        \
+                    ed = i;                 \
+                    wb1 = 0;                \
+                } else {                    \
+                    SMREAD();               \
+                    addr = geted32(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, &unscaled, 0xfff<<1, (1<<1)-1, rex, NULL, 0, D); \
+                    LDH(i, wback, fixedaddress);   \
+                    ed = i;                 \
+                    wb1 = 1;                \
+                }
 //GETEWO will use i for ed, i is also Offset, and can use r3 for wback.
 #define GETEWO(i, D) if(MODREG) {               \
                     wback = xRAX+(nextop&7)+(rex.b<<3);\
diff --git a/src/emu/x64run6766.c b/src/emu/x64run6766.c
index 33c2daf8..080abf91 100644
--- a/src/emu/x64run6766.c
+++ b/src/emu/x64run6766.c
@@ -72,6 +72,29 @@ uintptr_t Run6766(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
         return Run67660F(emu, rex, addr);
         #endif
 
+    case 0x81:                              /* GRP3 Ew,Iw */
+    case 0x83:                              /* GRP3 Ew,Ib */
+        nextop = F8;
+        GETEW32((opcode==0x81)?2:1);
+        GETGW;
+        if(opcode==0x81) 
+            tmp16u = F16;
+        else {
+            tmp16s = F8S;
+            tmp16u = (uint16_t)tmp16s;
+        }
+        switch((nextop>>3)&7) {
+            case 0: EW->word[0] = add16(emu, EW->word[0], tmp16u); break;
+            case 1: EW->word[0] =  or16(emu, EW->word[0], tmp16u); break;
+            case 2: EW->word[0] = adc16(emu, EW->word[0], tmp16u); break;
+            case 3: EW->word[0] = sbb16(emu, EW->word[0], tmp16u); break;
+            case 4: EW->word[0] = and16(emu, EW->word[0], tmp16u); break;
+            case 5: EW->word[0] = sub16(emu, EW->word[0], tmp16u); break;
+            case 6: EW->word[0] = xor16(emu, EW->word[0], tmp16u); break;
+            case 7:               cmp16(emu, EW->word[0], tmp16u); break;
+        }
+        break;
+
     case 0x89:                              /* MOV Ew,Gw */
         nextop = F8;
         GETEW32(0);