diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-11-07 17:40:48 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-11-07 17:40:48 +0100 |
| commit | 3cc9d47032cb14de9144284be4cca9ab9e6749ee (patch) | |
| tree | d79be38b1306159d0d4662b155c5fa3ac782b4eb /src/dynarec | |
| parent | 128708db2d6fe99ba0fe25978316eec4b2088774 (diff) | |
| download | box64-3cc9d47032cb14de9144284be4cca9ab9e6749ee.tar.gz box64-3cc9d47032cb14de9144284be4cca9ab9e6749ee.zip | |
Added some weird 67 and 64/65 prefixed opcodes ([ARM64_DYNAREC] too)
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 35 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 53 |
2 files changed, 88 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index 09576603..28078fc6 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -436,6 +436,25 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin emit_cmp32(dyn, ninst, rex, gd, ed, x3, x4, x5); break; + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + // just use regular conditional jump + return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog); + case 0x63: if(rex.is32bits) { // ARPL here @@ -948,6 +967,22 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("NOP"); break; + case 0x9D: + INST_NAME("POPF"); + SETFLAGS(X_ALL, SF_SET); + POP1z(xFlags); + MOV32w(x1, 0x3F7FD7); + ANDw_REG(xFlags, xFlags, x1); + MOV32w(x1, 0x202); + ORRw_REG(xFlags, xFlags, x1); + SET_DFNONE(x1); + if(box64_wine) { // should this be done all the time? + TBZ_NEXT(xFlags, F_TF); + // go to epilog, TF should trigger at end of next opcode, so using Interpreter only + jump_to_epilog(dyn, addr, 0, ninst); + } + break; + case 0xA1: INST_NAME("MOV EAX,FS:Od"); grab_segdata(dyn, addr, ninst, x4, seg); diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c index 358825c1..e5a4e613 100644 --- a/src/dynarec/arm64/dynarec_arm64_67.c +++ b/src/dynarec/arm64/dynarec_arm64_67.c @@ -682,6 +682,25 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin emit_cmp32_0(dyn, ninst, rex, xRAX, x3, x4); break; + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + // just use regular conditional jump + return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog); + case 0x63: INST_NAME("MOVSXD Gd, Ed"); nextop = F8; @@ -713,6 +732,21 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x0F: nextop = F8; switch(nextop) { + case 0x6F: + INST_NAME("MOVDQA Gx,Ex"); + nextop = F8; + if(MODREG) { + v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); + GETGX_empty(v0); + VMOVQ(v0, v1); + } else { + GETGX_empty(v0); + SMREAD(); + addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); + VLD128(v0, ed, fixedaddress); + } + break; + case 0x7E: INST_NAME("MOVD Ed,Gx"); nextop = F8; @@ -919,6 +953,25 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + // just use regular conditional jump + return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog); + case 0x81: case 0x83: nextop = F8; |