diff options
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_emit_shift.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_emit_shift.c b/src/dynarec/arm64/dynarec_arm64_emit_shift.c index b3803353..d69231ee 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_shift.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_shift.c @@ -1289,7 +1289,10 @@ void emit_shld16c(dynarec_arm_t* dyn, int ninst, int s1, int s2, uint32_t c, int } ORRw_REG_LSL(s1, s1, s2, 16); // create concat first IFX(X_CF) { - LSRw(s3, s1, 16-c); + if(c<16) + LSRw(s3, s1, 16-c); + else + MOVx_REG(s3, s1); BFIw(xFlags, s3, F_CF, 1); } IFX(X_OF) { @@ -1327,9 +1330,12 @@ void emit_shld16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s5, int s3, } ORRw_REG_LSL(s1, s1, s2, 16); // create concat first IFX(X_CF) { - MOV32w(s3, 16); - SUBw_REG(s3, s3, s5); - LSRw_REG(s3, s1, s3); + MOVw_REG(s3, s1); + CMPSw_U12(s5, 16); + Bcond(cGE, 4+3*4); + MOV32w(s3, 16); + SUBw_REG(s3, s3, s5); + LSRw_REG(s3, s1, s3); BFIw(xFlags, s3, F_CF, 1); } IFX(X_OF) { |