diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-22 11:08:07 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-22 11:08:07 +0200 |
| commit | 2c127fe69c421ec9ab9928c6364018ca3828a64b (patch) | |
| tree | 6c28b381ad16509e63becd1fc0c36371d9862a00 /src | |
| parent | 3765d9e6f75f44f035d6dd3b6614d1169f5f46ba (diff) | |
| download | box64-2c127fe69c421ec9ab9928c6364018ca3828a64b.tar.gz box64-2c127fe69c421ec9ab9928c6364018ca3828a64b.zip | |
[ARM64_DYANREC] Simplified emit_pf helper
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_emit_logic.c | 36 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_emit_math.c | 62 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_emit_shift.c | 50 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_emit_tests.c | 18 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 15 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 2 |
6 files changed, 90 insertions, 93 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_emit_logic.c b/src/dynarec/arm64/dynarec_arm64_emit_logic.c index 5381ff69..dcdffdab 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_logic.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_logic.c @@ -48,7 +48,7 @@ void emit_or32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -84,7 +84,7 @@ void emit_or32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -115,7 +115,7 @@ void emit_xor32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -151,7 +151,7 @@ void emit_xor32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -185,7 +185,7 @@ void emit_and32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -228,7 +228,7 @@ void emit_and32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -251,7 +251,7 @@ void emit_or8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -279,7 +279,7 @@ void emit_or8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -302,7 +302,7 @@ void emit_xor8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -330,7 +330,7 @@ void emit_xor8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4 } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -364,7 +364,7 @@ void emit_and8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -407,7 +407,7 @@ void emit_and8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4 BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -431,7 +431,7 @@ void emit_or16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 16) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -477,7 +477,7 @@ void emit_or16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) // BFI(xFlags, s3, F_SF, 1); // } // IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); +// emit_pf(dyn, ninst, s1, s4); // } //} @@ -500,7 +500,7 @@ void emit_xor16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 16) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -546,7 +546,7 @@ void emit_xor16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) // BFI(xFlags, s3, F_SF, 1); // } // IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); +// emit_pf(dyn, ninst, s1, s4); // } //} @@ -580,7 +580,7 @@ void emit_and16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -626,6 +626,6 @@ void emit_and16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) // BFI(xFlags, s3, F_SF, 1); // } // IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); +// emit_pf(dyn, ninst, s1, s4); // } //} diff --git a/src/dynarec/arm64/dynarec_arm64_emit_math.c b/src/dynarec/arm64/dynarec_arm64_emit_math.c index 6449de5c..5623e07b 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_math.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_math.c @@ -67,7 +67,7 @@ void emit_add32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 BFIx(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -139,7 +139,7 @@ void emit_add32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in BFIx(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -190,7 +190,7 @@ void emit_sub32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 BFIx(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -263,7 +263,7 @@ void emit_sub32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in BFIx(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -304,7 +304,7 @@ void emit_add8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -347,7 +347,7 @@ void emit_add8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -391,7 +391,7 @@ void emit_sub8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -441,7 +441,7 @@ void emit_sub8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4, in } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -483,7 +483,7 @@ void emit_add16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 16) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -550,7 +550,7 @@ void emit_add16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) // BFI(xFlags, s3, F_SF, 1); // } // IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); +// emit_pf(dyn, ninst, s1, s4); // } //} @@ -593,7 +593,7 @@ void emit_sub16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 16) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -658,7 +658,7 @@ void emit_sub16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) // BFI(xFlags, s3, F_SF, 1); // } // IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); +// emit_pf(dyn, ninst, s1, s4); // } //} @@ -707,7 +707,7 @@ void emit_inc32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int s4 BFIxw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -743,7 +743,7 @@ void emit_inc8(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -780,7 +780,7 @@ void emit_inc16(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) } COMP_ZFSF(s1, 16) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -830,7 +830,7 @@ void emit_dec32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int s4 BFIxw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -878,7 +878,7 @@ void emit_dec8(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -926,7 +926,7 @@ void emit_dec16(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -980,7 +980,7 @@ void emit_adc32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1050,7 +1050,7 @@ void emit_adc32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 // BFI(xFlags, s3, F_SF, 1); // } // IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); +// emit_pf(dyn, ninst, s1, s4); // } //} @@ -1096,7 +1096,7 @@ void emit_adc8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1150,7 +1150,7 @@ void emit_adc16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 16) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1217,7 +1217,7 @@ void emit_adc16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) // BFI(xFlags, s3, F_SF, 1); // } // IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); +// emit_pf(dyn, ninst, s1, s4); // } //} @@ -1273,7 +1273,7 @@ void emit_sbb32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1345,7 +1345,7 @@ void emit_sbb32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 // BFI(xFlags, s3, F_SF, 1); // } // IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); +// emit_pf(dyn, ninst, s1, s4); // } //} @@ -1392,7 +1392,7 @@ void emit_sbb8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1447,7 +1447,7 @@ void emit_sbb16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) } COMP_ZFSF(s1, 16) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1514,7 +1514,7 @@ void emit_sbb16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) // BFI(xFlags, s3, F_SF, 1); // } // IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); +// emit_pf(dyn, ninst, s1, s4); // } //} @@ -1561,7 +1561,7 @@ void emit_neg32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int s4 BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1611,7 +1611,7 @@ void emit_neg16(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1660,6 +1660,6 @@ void emit_neg8(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } diff --git a/src/dynarec/arm64/dynarec_arm64_emit_shift.c b/src/dynarec/arm64/dynarec_arm64_emit_shift.c index 5fc6bf9b..84166055 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_shift.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_shift.c @@ -75,7 +75,7 @@ void emit_shl32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -138,7 +138,7 @@ void emit_shl32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, i MOV32w(s3, 1); BFIw(xFlags, s3, F_PF, 1); } else - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -185,7 +185,7 @@ void emit_shr32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -234,7 +234,7 @@ void emit_shr32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, i BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -277,7 +277,7 @@ void emit_sar32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, i BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -318,7 +318,7 @@ void emit_shl8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -358,7 +358,7 @@ void emit_shl8c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int s BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } else { IFX(X_CF) { @@ -422,7 +422,7 @@ void emit_shr8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -462,7 +462,7 @@ void emit_shr8c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int s BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -496,7 +496,7 @@ void emit_sar8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -527,7 +527,7 @@ void emit_sar8c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int s BFCw(xFlags, F_OF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } else { LSRw(s3, s1, 7); @@ -577,7 +577,7 @@ void emit_shl16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -622,7 +622,7 @@ void emit_shl16c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int MOV32w(s3, 1); BFIw(xFlags, s3, F_PF, 1); } else - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } else { IFX(X_CF) { @@ -679,7 +679,7 @@ void emit_shr16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -720,7 +720,7 @@ void emit_shr16c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -754,7 +754,7 @@ void emit_sar16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -788,7 +788,7 @@ void emit_sar16c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int BFCw(xFlags, F_AF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } // emit ROL32 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch @@ -1238,7 +1238,7 @@ void emit_shrd32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, uint } } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1293,7 +1293,7 @@ void emit_shld32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, uint } } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1341,7 +1341,7 @@ void emit_shrd32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s EORw_REG_LSL(xFlags, xFlags, s3, F_OF); // OF is set if sign changed } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1387,7 +1387,7 @@ void emit_shld32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s EORw_REG_LSL(xFlags, xFlags, s3, F_OF); // OF is set if sign changed } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1431,7 +1431,7 @@ void emit_shrd16c(dynarec_arm_t* dyn, int ninst, int s1, int s2, uint32_t c, int } } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1468,7 +1468,7 @@ void emit_shrd16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s5, int s3, EORw_REG_LSL(xFlags, xFlags, s3, F_OF); // OF is set if sign changed } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1519,7 +1519,7 @@ void emit_shld16c(dynarec_arm_t* dyn, int ninst, int s1, int s2, uint32_t c, int } } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -1559,6 +1559,6 @@ void emit_shld16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s5, int s3, EORw_REG_LSL(xFlags, xFlags, s3, F_OF); // OF is set if sign changed } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } diff --git a/src/dynarec/arm64/dynarec_arm64_emit_tests.c b/src/dynarec/arm64/dynarec_arm64_emit_tests.c index 5c6c602f..5c402158 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_tests.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_tests.c @@ -64,7 +64,7 @@ void emit_cmp32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s5, s3, s4); + emit_pf(dyn, ninst, s5, s4); } } @@ -96,7 +96,7 @@ void emit_cmp32_0(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int BFIw(xFlags, s3, F_SF, 1); } IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -138,7 +138,7 @@ void emit_cmp16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, i } } IFX(X_PF) { - emit_pf(dyn, ninst, s5, s3, s4); + emit_pf(dyn, ninst, s5, s4); } } @@ -161,7 +161,7 @@ void emit_cmp16_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) } COMP_ZFSF(s1, 16) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } // emit CMP8 instruction, from cmp s1, s2, using s3 and s4 as scratch @@ -201,7 +201,7 @@ void emit_cmp8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, in } } IFX(X_PF) { - emit_pf(dyn, ninst, s5, s3, s4); + emit_pf(dyn, ninst, s5, s4); } } // emit CMP8 instruction, from cmp s1 , 0, using s3 and s4 as scratch @@ -223,7 +223,7 @@ void emit_cmp8_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) } COMP_ZFSF(s1, 8) IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + emit_pf(dyn, ninst, s1, s4); } } @@ -254,7 +254,7 @@ void emit_test32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s } // PF: (((emu->x64emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0) IFX(X_PF) { - emit_pf(dyn, ninst, s3, s4, s5); + emit_pf(dyn, ninst, s3, s5); } } @@ -285,7 +285,7 @@ void emit_test16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, } // PF: (((emu->x64emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0) IFX(X_PF) { - emit_pf(dyn, ninst, s5, s3, s4); + emit_pf(dyn, ninst, s5, s4); } } @@ -316,6 +316,6 @@ void emit_test8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, i } // PF: (((emu->x64emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0) IFX(X_PF) { - emit_pf(dyn, ninst, s5, s3, s4); + emit_pf(dyn, ninst, s5, s4); } } diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 34704e73..568483dd 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -2155,17 +2155,14 @@ void fpu_unreflectcache(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3) x87_unreflectcache(dyn, ninst, s1, s2, s3); } -void emit_pf(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) +void emit_pf(dynarec_arm_t* dyn, int ninst, int s1, int s4) { MAYUSE(dyn); MAYUSE(ninst); - MAYUSE(s1); MAYUSE(s3); MAYUSE(s4); - // PF: (((emu->x64emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0) - ANDw_mask(s3, s1, 0b011011, 0b000010); // mask=0xE0 - LSRw(s3, s3, 5); - TABLE64(s4, (uintptr_t)GetParityTab()); - LDRw_REG_LSL2(s4, s4, s3); - ANDw_mask(s3, s1, 0, 0b000100); //0x1f - LSRw_REG(s4, s4, s3); + MAYUSE(s1); MAYUSE(s4); + // by xor'ing all the bit 2 by two with a shift, pair of bits are removed, and only 1 is left if bit number if odd + EORw_REG_LSR(s4, s1, s1, 4); + EORw_REG_LSR(s4, s4, s4, 2); + EORw_REG_LSR(s4, s4, s4, 1); MVNw_REG(s4, s4); BFIw(xFlags, s4, F_PF, 1); } diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index 6279d2f1..345ce432 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -1272,7 +1272,7 @@ void emit_shrd16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s5, int s3, void emit_shld16c(dynarec_arm_t* dyn, int ninst, int s1, int s2, uint32_t c, int s3, int s4); void emit_shld16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s5, int s3, int s4); -void emit_pf(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4); +void emit_pf(dynarec_arm_t* dyn, int ninst, int s1, int s4); // x87 helper // cache of the local stack counter, to avoid update at every call, return old internal stack counter |