diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_0f.c | 12 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_660f.c | 19 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c index 54e5f2d5..8e00682e 100755 --- a/src/dynarec/dynarec_arm64_0f.c +++ b/src/dynarec/dynarec_arm64_0f.c @@ -177,6 +177,18 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin BFIw(xFlags, x4, F_CF, 1); break; + case 0xA5: + nextop = F8; + INST_NAME("SHLD Ed, Gd, CL"); + UXTBw(x3, xRCX); + SETFLAGS(X_ALL, SF_SET); + GETEDW(x4, x1, 0); + GETGD; + MOVxw_REG(x2, gd); + CALL_(rex.w?((void*)shld64):((void*)shld32), ed, x4); + WBACK; + break; + case 0xAB: INST_NAME("BTS Ed, Gd"); SETFLAGS(X_CF, SF_SET); diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c index e82d51ef..475bcab1 100755 --- a/src/dynarec/dynarec_arm64_660f.c +++ b/src/dynarec/dynarec_arm64_660f.c @@ -78,6 +78,25 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n LSRw_REG(x1, ed, x2); BFIw(xFlags, x1, F_CF, 1); break; + case 0xA4: + case 0xA5: + nextop = F8; + if(opcode==0xA4) { + INST_NAME("SHLD Ew, Gw, Ib"); + } else { + INST_NAME("SHLD Ew, Gw, CL"); + UXTBw(x3, xRCX); + } + SETFLAGS(X_ALL, SF_SET); + GETEWW(x4, x1, (opcode==0xA4)?1:0); + GETGW(x2); + if(opcode==0xA4) { + u8 = F8; + MOV32w(x3, u8); + } + CALL_(shld16, x1, wback); + EWBACKW(x1); + break; case 0xAB: INST_NAME("BTS Ew, Gw"); |