diff options
| author | ptitSeb <seebastien.chev@gmail.com> | 2023-08-15 13:19:43 +0200 |
|---|---|---|
| committer | ptitSeb <seebastien.chev@gmail.com> | 2023-08-15 13:19:43 +0200 |
| commit | d6216707351353bb74a6d323da27e7351151243c (patch) | |
| tree | 931e4249ee1e3ddf5f9b89fecaaff909c3a4f52a /src | |
| parent | 6653cce46451278bf65dfb121c670694c07356e6 (diff) | |
| download | box64-d6216707351353bb74a6d323da27e7351151243c.tar.gz box64-d6216707351353bb74a6d323da27e7351151243c.zip | |
[ARM64_DYNAREC] Added 0F C0/C1 ocpodes (helps #927)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_0f.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c index 789fe27e..e4aa3657 100644 --- a/src/dynarec/arm64/dynarec_arm64_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_0f.c @@ -30,8 +30,8 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin uint8_t opcode = F8; uint8_t nextop, u8; uint8_t gd, ed; - uint8_t wback, wb2; - uint8_t eb1, eb2; + uint8_t wback, wb1, wb2; + uint8_t eb1, eb2, gb1, gb2; int32_t i32, i32_; int cacheupd = 0; int v0, v1; @@ -42,9 +42,12 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin int64_t j64; int64_t fixedaddress; int unscaled; + MAYUSE(wb1); MAYUSE(wb2); MAYUSE(eb1); MAYUSE(eb2); + MAYUSE(gb1); + MAYUSE(gb2); MAYUSE(q0); MAYUSE(q1); MAYUSE(d0); @@ -1579,7 +1582,29 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin LDSHxw(gd, ed, fixedaddress); } break; - + case 0xC0: + INST_NAME("XADD Gb, Eb"); + SETFLAGS(X_ALL, SF_SET_PENDING); + nextop = F8; + GETGB(x1); + GETEB(x2, 0); + gd = x2; ed = x1; // swap gd/ed + emit_add8(dyn, ninst, x1, x2, x4, x5); + GBBACK; // gb gets x2 (old ed) + EBBACK; // eb gets x1 (sum) + break; + case 0xC1: + INST_NAME("XADD Gd, Ed"); + SETFLAGS(X_ALL, SF_SET_PENDING); + nextop = F8; + GETGD; + GETED(0); + MOVxw_REG(x3, ed); + MOVxw_REG(ed, gd); + MOVxw_REG(gd, x3); + emit_add32(dyn, ninst, rex, ed, gd, x4, x5); + WBACK; + break; case 0xC2: INST_NAME("CMPPS Gx, Ex, Ib"); nextop = F8; |