about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-06-11 16:42:05 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-06-11 16:42:05 +0200
commita356eb7abf8bda6e885c2316f3b353cd2f6b0397 (patch)
tree5738cf304bce9420a99360c3b4e484eb93171e89 /src/dynarec
parente950872ec9e4ef0f6b89aa4708e78c0f0aa6ecc5 (diff)
downloadbox64-a356eb7abf8bda6e885c2316f3b353cd2f6b0397.tar.gz
box64-a356eb7abf8bda6e885c2316f3b353cd2f6b0397.zip
Added 67 83 opcode ([DYNAREC] too) (for #323)
Diffstat (limited to 'src/dynarec')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_67.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c
index 0b513909..aba42529 100755
--- a/src/dynarec/arm64/dynarec_arm64_67.c
+++ b/src/dynarec/arm64/dynarec_arm64_67.c
@@ -124,6 +124,84 @@ 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 Ed, Id");} else {INST_NAME("ADD Ed, Ib");}

+                    SETFLAGS(X_ALL, SF_SET_PENDING);

+                    GETED32((opcode==0x81)?4:1);

+                    if(opcode==0x81) i64 = F32S; else i64 = F8S;

+                    emit_add32c(dyn, ninst, rex, ed, i64, x3, x4, x5);

+                    WBACK;

+                    break;

+                case 1: //OR

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

+                    SETFLAGS(X_ALL, SF_SET_PENDING);

+                    GETED32((opcode==0x81)?4:1);

+                    if(opcode==0x81) i64 = F32S; else i64 = F8S;

+                    emit_or32c(dyn, ninst, rex, ed, i64, x3, x4);

+                    WBACK;

+                    break;

+                case 2: //ADC

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

+                    READFLAGS(X_CF);

+                    SETFLAGS(X_ALL, SF_SET_PENDING);

+                    GETED32((opcode==0x81)?4:1);

+                    if(opcode==0x81) i64 = F32S; else i64 = F8S;

+                    MOV64xw(x5, i64);

+                    emit_adc32(dyn, ninst, rex, ed, x5, x3, x4);

+                    WBACK;

+                    break;

+                case 3: //SBB

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

+                    READFLAGS(X_CF);

+                    SETFLAGS(X_ALL, SF_SET_PENDING);

+                    GETED32((opcode==0x81)?4:1);

+                    if(opcode==0x81) i64 = F32S; else i64 = F8S;

+                    MOV64xw(x5, i64);

+                    emit_sbb32(dyn, ninst, rex, ed, x5, x3, x4);

+                    WBACK;

+                    break;

+                case 4: //AND

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

+                    SETFLAGS(X_ALL, SF_SET_PENDING);

+                    GETED32((opcode==0x81)?4:1);

+                    if(opcode==0x81) i64 = F32S; else i64 = F8S;

+                    emit_and32c(dyn, ninst, rex, ed, i64, x3, x4);

+                    WBACK;

+                    break;

+                case 5: //SUB

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

+                    SETFLAGS(X_ALL, SF_SET_PENDING);

+                    GETED32((opcode==0x81)?4:1);

+                    if(opcode==0x81) i64 = F32S; else i64 = F8S;

+                    emit_sub32c(dyn, ninst, rex, ed, i64, x3, x4, x5);

+                    WBACK;

+                    break;

+                case 6: //XOR

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

+                    SETFLAGS(X_ALL, SF_SET_PENDING);

+                    GETED32((opcode==0x81)?4:1);

+                    if(opcode==0x81) i64 = F32S; else i64 = F8S;

+                    emit_xor32c(dyn, ninst, rex, ed, i64, x3, x4);

+                    WBACK;

+                    break;

+                case 7: //CMP

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

+                    SETFLAGS(X_ALL, SF_SET_PENDING);

+                    GETED32((opcode==0x81)?4:1);

+                    if(opcode==0x81) i64 = F32S; else i64 = F8S;

+                    if(i64) {

+                        MOV64xw(x2, i64);

+                        emit_cmp32(dyn, ninst, rex, ed, x2, x3, x4, x5);

+                    } else

+                        emit_cmp32_0(dyn, ninst, rex, ed, x3, x4);

+                    break;

+            }

+            break;

+            

         case 0x89:

             INST_NAME("MOV Ed, Gd");

             nextop=F8;