diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_0f38.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c index 9b7ae7a0..f9e3a9e8 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c @@ -273,22 +273,24 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i GETGD; GETED(0); GETVD; - MOV64xw(x1, 0); - UXTBw(x2, vd); // start - BFXILw(x3, vd, 8, 8); // length + MOV64xw(x5, 0); + UXTBw(x4, vd); // start + UBFXw(x3, vd, 8, 8); // length TSTw_REG(x3, x3); B_MARK(cEQ); - LSRxw_REG(x1, ed, x2); - CMPSw_U12(x3, rex.w?64:32); + CMPSw_U12(x4, rex.w?64:32); B_MARK(cGE); - MOV32w(x2, rex.w?64:32); - SUBw_REG(x2, x2, x3); - LSLxw_REG(x1, x1, x2); - LSRxw_REG(x1, x1, x2); - TSTxw_REG(x1, x1); + LSRxw_REG(x5, ed, x4); + CMPSw_U12(x3, rex.w?64:32); + B_MARK(cGT); + MOV32w(x4, rex.w?64:32); + SUBw_REG(x4, x4, x3); + LSLxw_REG(x5, x5, x4); + LSRxw_REG(x5, x5, x4); MARK; - MOVxw_REG(gd, x1); + MOVxw_REG(gd, x5); IFX(X_ZF) { + TSTxw_REG(x5, x5); IFNATIVE(NF_EQ) {} else { CSETw(x3, cEQ); BFIw(xFlags, x3, F_ZF, 1); |