about summary refs log tree commit diff stats
path: root/src/dynarec
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/dynarec
parent27aa9011ce0b83428dad48d96d66135d7301c236 (diff)
downloadbox64-da7474b1de99c3952f9b1c67275e7a5bf44e7121.tar.gz
box64-da7474b1de99c3952f9b1c67275e7a5bf44e7121.zip
Added 67 66 83 opcodes ([ARM64_DYNAREC] too)
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c83
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.h13
2 files changed, 96 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);\