diff options
| author | wannacu <wannacu2049@gmail.com> | 2023-08-15 18:02:04 +0800 |
|---|---|---|
| committer | wannacu <wannacu2049@gmail.com> | 2023-08-17 09:05:49 +0800 |
| commit | 7f775b7662c888f831995bd0e82daa9689e94635 (patch) | |
| tree | 050ab7c19f771d92aa9e16cf14905dc7b2df4199 /src | |
| parent | 48317e07888f8c0a3e5bbc644bb3771c1c679a6e (diff) | |
| download | box64-7f775b7662c888f831995bd0e82daa9689e94635.tar.gz box64-7f775b7662c888f831995bd0e82daa9689e94635.zip | |
[ARM64_DYNAREC] Added F0 10/11 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_66f0.c | 23 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f0.c | 50 |
2 files changed, 71 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66f0.c b/src/dynarec/arm64/dynarec_arm64_66f0.c index 3f606799..fe32cf99 100644 --- a/src/dynarec/arm64/dynarec_arm64_66f0.c +++ b/src/dynarec/arm64/dynarec_arm64_66f0.c @@ -152,7 +152,28 @@ uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n DEFAULT; } break; - + case 0x11: + INST_NAME("LOCK ADC Ew, Gw"); + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET_PENDING); + nextop = F8; + GETGW(x5); + SMDMB(); + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + UXTHw(x6, ed); + emit_adc16(dyn, ninst, x6, x5, x3, x4); + BFIx(ed, x6, 0, 16); + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0); + MARKLOCK; + LDAXRH(x1, wback); + emit_adc16(dyn, ninst, x1, x5, x3, x4); + STLXRH(x3, x1, wback); + CBNZx_MARKLOCK(x3); + } + SMDMB(); + break; case 0x81: case 0x83: nextop = F8; diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c index da747204..07e4b766 100644 --- a/src/dynarec/arm64/dynarec_arm64_f0.c +++ b/src/dynarec/arm64/dynarec_arm64_f0.c @@ -436,7 +436,55 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin DEFAULT; } break; - + case 0x10: + INST_NAME("LOCK ADC Eb, Gb"); + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET_PENDING); + nextop = F8; + SMDMB(); + GETGB(x2); + if((nextop&0xC0)==0xC0) { + if(rex.rex) { + wback = xRAX + (nextop&7) + (rex.b<<3); + wb2 = 0; + } else { + wback = (nextop&7); + wb2 = (wback>>2); + wback = xRAX+(wback&3); + } + UBFXw(x1, wback, wb2*8, 8); + emit_adc8(dyn, ninst, x1, x2, x4, x5); + BFIx(wback, x1, wb2*8, 8); + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0); + MARKLOCK; + LDAXRB(x1, wback); + emit_adc8(dyn, ninst, x1, x2, x4, x5); + STLXRB(x4, x1, wback); + CBNZx_MARKLOCK(x4); + } + SMDMB(); + break; + case 0x11: + INST_NAME("LOCK ADC Ed, Gd"); + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET_PENDING); + nextop = F8; + GETGD; + SMDMB(); + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + emit_adc32(dyn, ninst, rex, ed, gd, x3, x4); + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0); + MARKLOCK; + LDAXRxw(x1, wback); + emit_adc32(dyn, ninst, rex, x1, gd, x4, x5); + STLXRxw(x4, x1, wback); + CBNZx_MARKLOCK(x4); + } + SMDMB(); + break; case 0x21: INST_NAME("LOCK AND Ed, Gd"); SETFLAGS(X_ALL, SF_SET_PENDING); |