diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-06-18 13:17:37 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-06-18 13:17:37 +0200 |
| commit | f300e76c9bc7d7ee993d6f5c8e6c6112e3db7147 (patch) | |
| tree | 364f51a2b46ad3dd536b353aeb3b1ec0cae6c5ef | |
| parent | 8f6f880b6a5375c9e54c8a5cd54d61f0d169c211 (diff) | |
| download | box64-f300e76c9bc7d7ee993d6f5c8e6c6112e3db7147.tar.gz box64-f300e76c9bc7d7ee993d6f5c8e6c6112e3db7147.zip | |
[DYNAREC] Optimized some flags handling for a few of the complex emiter (+10% speed in 7z bench)
| -rwxr-xr-x | src/dynarec/dynarec_arm64_emit_math.c | 88 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_emit_shift.c | 35 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_emit_tests.c | 32 |
3 files changed, 60 insertions, 95 deletions
diff --git a/src/dynarec/dynarec_arm64_emit_math.c b/src/dynarec/dynarec_arm64_emit_math.c index 8b5ef974..97eedfe9 100755 --- a/src/dynarec/dynarec_arm64_emit_math.c +++ b/src/dynarec/dynarec_arm64_emit_math.c @@ -52,21 +52,17 @@ void emit_add32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 LSRxw(s4, s3, 3); BFIxw(xFlags, s4, F_AF, 1); // AF: bc & 0x08 } - IFX(X_ZF|X_CF|X_OF) { - MOV32w(s3, (1<<F_ZF)|(1<<F_CF)|(1<<F_OF)); - BICx(xFlags, xFlags, s3); - } IFX(X_ZF) { - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_CF) { - Bcond(cCC, +8); - ORRw_mask(xFlags, xFlags, 0, 0); // mask=0x01 + CSETw(s4, cCS); + BFIw(xFlags, s4, F_CF, 1); } IFX(X_OF) { - Bcond(cVC, +8); - ORRw_mask(xFlags, xFlags, 0b010101, 0); // mask=0x800 + CSETw(s4, cVS); + BFIw(xFlags, s4, F_OF, 1); } IFX(X_SF) { LSRxw(s3, s1, (rex.w)?63:31); @@ -128,21 +124,17 @@ void emit_add32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in LSRxw(s4, s3, 3); BFIxw(xFlags, s4, F_AF, 1); // AF: bc & 0x08 } - IFX(X_ZF|X_CF|X_OF) { - MOV32w(s3, (1<<F_ZF)|(1<<F_CF)|(1<<F_OF)); - BICx(xFlags, xFlags, s3); - } IFX(X_ZF) { - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_CF) { - Bcond(cCC, +8); - ORRw_mask(xFlags, xFlags, 0, 0); // mask=0x01 + CSETw(s4, cCS); + BFIw(xFlags, s4, F_CF, 1); } IFX(X_OF) { - Bcond(cVC, +8); - ORRw_mask(xFlags, xFlags, 0b010101, 0); // mask=0x800 + CSETw(s4, cVS); + BFIw(xFlags, s4, F_OF, 1); } IFX(X_SF) { LSRxw(s3, s1, (rex.w)?63:31); @@ -183,22 +175,18 @@ void emit_sub32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 LSRxw(s4, s3, 3); BFIx(xFlags, s4, F_AF, 1); // AF: bc & 0x08 } - IFX(X_ZF|X_CF|X_OF) { - MOV32w(s3, (1<<F_ZF)|(1<<F_CF)|(1<<F_OF)); - BICx(xFlags, xFlags, s3); - } IFX(X_ZF) { - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_CF) { // inverted carry - Bcond(cCS, +8); - ORRw_mask(xFlags, xFlags, 0, 0); // mask=0x01 + CSETw(s4, cCC); + BFIw(xFlags, s4, F_CF, 1); } IFX(X_OF) { - Bcond(cVC, +8); - ORRw_mask(xFlags, xFlags, 0b010101, 0); // mask=0x800 + CSETw(s4, cVS); + BFIw(xFlags, s4, F_OF, 1); } IFX(X_SF) { LSRxw(s3, s1, (rex.w)?63:31); @@ -260,22 +248,18 @@ void emit_sub32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in LSRxw(s4, s3, 3); BFIw(xFlags, s4, F_AF, 1); // AF: bc & 0x08 } - IFX(X_ZF|X_CF|X_OF) { - MOV32w(s3, (1<<F_ZF)|(1<<F_CF)|(1<<F_OF)); - BICx(xFlags, xFlags, s3); - } IFX(X_ZF) { - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_CF) { // inverted carry - Bcond(cCS, +8); - ORRw_mask(xFlags, xFlags, 0, 0); // mask=0x01 + CSETw(s4, cCC); + BFIw(xFlags, s4, F_CF, 1); } IFX(X_OF) { - Bcond(cVC, +8); - ORRw_mask(xFlags, xFlags, 0b010101, 0); // mask=0x800 + CSETw(s4, cVS); + BFIw(xFlags, s4, F_OF, 1); } IFX(X_SF) { LSRxw(s3, s1, (rex.w)?63:31); @@ -765,17 +749,13 @@ void emit_inc32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int s4 LSRxw(s4, s3, 3); BFIxw(xFlags, s4, F_AF, 1); // AF: bc & 0x08 } - IFX(X_ZF|X_OF) { - MOV32w(s3, (1<<F_ZF)|(1<<F_OF)); - BICx(xFlags, xFlags, s3); - } IFX(X_ZF) { - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_OF) { - Bcond(cVC, +8); - ORRw_mask(xFlags, xFlags, 0b010101, 0); // mask=0x800 + CSETw(s4, cVS); + BFIw(xFlags, s4, F_OF, 1); } IFX(X_SF) { LSRxw(s3, s1, rex.w?63:31); @@ -909,17 +889,13 @@ void emit_dec32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int s4 LSRxw(s4, s3, 3); BFIw(xFlags, s4, F_AF, 1); // AF: bc & 0x08 } - IFX(X_ZF|X_OF) { - MOV32w(s3, (1<<F_ZF)|(1<<F_OF)); - BICx(xFlags, xFlags, s3); - } IFX(X_ZF) { - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_OF) { - Bcond(cVC, +8); - ORRw_mask(xFlags, xFlags, 0b010101, 0); // mask=0x800 + CSETw(s4, cVS); + BFIw(xFlags, s4, F_OF, 1); } IFX(X_SF) { LSRxw(s3, s1, rex.w?63:31); diff --git a/src/dynarec/dynarec_arm64_emit_shift.c b/src/dynarec/dynarec_arm64_emit_shift.c index db76657d..c89546e1 100755 --- a/src/dynarec/dynarec_arm64_emit_shift.c +++ b/src/dynarec/dynarec_arm64_emit_shift.c @@ -61,9 +61,8 @@ void emit_shl32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 } IFX(X_ZF) { TSTxw_REG(s1, s1); - BFCx(xFlags, F_ZF, 1); - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_SF) { LSRxw(s4, s1, (rex.w)?63:31); @@ -112,9 +111,8 @@ void emit_shl32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int32_t c, in } IFX(X_ZF) { TSTxw_REG(s1, s1); - BFCx(xFlags, F_ZF, 1); - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_SF) { LSRxw(s4, s1, (rex.w)?63:31); @@ -167,9 +165,8 @@ void emit_shr32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 } IFX(X_ZF) { TSTxw_REG(s1, s1); - BFCx(xFlags, F_ZF, 1); - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_SF) { LSRxw(s4, s1, (rex.w)?63:31); @@ -218,9 +215,8 @@ void emit_shr32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int32_t c, in } IFX(X_ZF) { TSTxw_REG(s1, s1); - BFCx(xFlags, F_ZF, 1); - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_SF) { LSRxw(s4, s1, (rex.w)?63:31); @@ -265,9 +261,8 @@ void emit_sar32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int32_t c, in } IFX(X_ZF) { TSTw_REG(s1, s1); - BFCx(xFlags, F_ZF, 1); - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_SF) { LSRxw(s4, s1, (rex.w)?63:31); @@ -374,9 +369,8 @@ void emit_shrd32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int3 } IFX(X_ZF) { TSTxw_REG(s1, s1); - BFCx(xFlags, F_ZF, 1); - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_SF) { LSRxw(s4, s1, (rex.w)?63:31); @@ -427,9 +421,8 @@ void emit_shld32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int3 } IFX(X_ZF) { TSTxw_REG(s1, s1); - BFCx(xFlags, F_ZF, 1); - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_SF) { LSRxw(s4, s1, (rex.w)?63:31); diff --git a/src/dynarec/dynarec_arm64_emit_tests.c b/src/dynarec/dynarec_arm64_emit_tests.c index ad9e08a2..cb82e6a0 100755 --- a/src/dynarec/dynarec_arm64_emit_tests.c +++ b/src/dynarec/dynarec_arm64_emit_tests.c @@ -48,22 +48,18 @@ void emit_cmp32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 LSRxw(s4, s3, 3); BFIx(xFlags, s4, F_AF, 1); // AF: bc & 0x08 } - IFX(X_ZF|X_CF|X_OF) { - MOV32w(s4, (1<<F_ZF)|(1<<F_CF)|(1<<F_OF)); - BICx(xFlags, xFlags, s4); - } IFX(X_ZF) { - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_CF) { // inverted carry - Bcond(cCS, +8); - ORRw_mask(xFlags, xFlags, 0, 0); // mask=0x01 + CSETw(s4, cCC); + BFIw(xFlags, s4, F_CF, 1); } IFX(X_OF) { - Bcond(cVC, +8); - ORRw_mask(xFlags, xFlags, 0b010101, 0); // mask=0x800 + CSETw(s4, cVS); + BFIw(xFlags, s4, F_OF, 1); } IFX(X_SF) { LSRxw(s3, s5, (rex.w)?63:31); @@ -89,18 +85,18 @@ void emit_cmp32_0(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int SUBSxw_U12(s3, s1, 0); // res = s1 - 0 // and now the tricky ones (and mostly unused), PF and AF // bc = (res & (~d | s)) | (~d & s) => is 0 here... - IFX(X_ZF|X_CF|X_OF|X_AF) { - MOV32w(s4, (1<<F_ZF)|(1<<F_CF)|(1<<F_OF)|(1<<F_AF)); + IFX(X_OF|X_AF) { + MOV32w(s4, (1<<F_OF)|(1<<F_AF)); BICw(xFlags, xFlags, s4); } IFX(X_ZF) { - Bcond(cNE, +8); - ORRw_mask(xFlags, xFlags, 0b011010, 0); // mask=0x40 + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); } IFX(X_CF) { // inverted carry - Bcond(cCS, +8); - ORRw_mask(xFlags, xFlags, 0, 0); // mask=0x01 + CSETw(s4, cCC); + BFIw(xFlags, s4, F_CF, 1); } IFX(X_SF) { LSRxw(s3, s1, (rex.w)?63:31); @@ -255,8 +251,8 @@ void emit_cmp8_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) SET_DFNONE(s4); } // bc = (res & (~d | s)) | (~d & s) = 0 - IFX(X_CF | X_AF | X_ZF | X_OF) { - MOV32w(s3, (1<<F_ZF)|(1<<F_CF)|(1<<F_AF)|(1<<F_OF)); + IFX(X_CF | X_AF | X_OF) { + MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF)); BICw(xFlags, xFlags, s3); } IFX(X_ZF) { |