From a3765ec0f86695ecb0d2ac644d98cbc1a57bfa64 Mon Sep 17 00:00:00 2001 From: wannacu Date: Wed, 9 Aug 2023 15:50:28 +0800 Subject: [ARM64_DYNAREC] Correct PF caculation --- src/dynarec/arm64/dynarec_arm64_00.c | 6 +++--- src/dynarec/arm64/dynarec_arm64_64.c | 2 +- src/dynarec/arm64/dynarec_arm64_67.c | 2 +- src/dynarec/arm64/dynarec_arm64_emit_tests.c | 17 +++++------------ src/dynarec/arm64/dynarec_arm64_helper.h | 2 +- 5 files changed, 11 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 8f2f6882..c760d9d4 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -1008,7 +1008,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin nextop=F8; GETGD; GETED(0); - emit_test32(dyn, ninst, rex, ed, gd, x3, x5); + emit_test32(dyn, ninst, rex, ed, gd, x3, x5, x6); break; case 0x86: INST_NAME("(LOCK)XCHG Eb, Gb"); @@ -1477,7 +1477,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; MOV64xw(x2, i64); - emit_test32(dyn, ninst, rex, xRAX, x2, x3, x4); + emit_test32(dyn, ninst, rex, xRAX, x2, x3, x4, x5); break; case 0xAA: if(rep) { @@ -2608,7 +2608,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETEDH(x1, 4); i64 = F32S; MOV64xw(x2, i64); - emit_test32(dyn, ninst, rex, ed, x2, x3, x4); + emit_test32(dyn, ninst, rex, ed, x2, x3, x4, x5); break; case 2: INST_NAME("NOT Ed"); diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index 540ab50e..d88f3b69 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -884,7 +884,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETEDO(x6, 4); i64 = F32S; MOV64xw(x2, i64); - emit_test32(dyn, ninst, rex, ed, x2, x3, x4); + emit_test32(dyn, ninst, rex, ed, x2, x3, x4, x5); break; case 2: INST_NAME("NOT Ed"); diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c index 04065e7a..06e1e93a 100644 --- a/src/dynarec/arm64/dynarec_arm64_67.c +++ b/src/dynarec/arm64/dynarec_arm64_67.c @@ -990,7 +990,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETED32H(x1, 4); i64 = F32S; MOV64xw(x2, i64); - emit_test32(dyn, ninst, rex, ed, x2, x3, x4); + emit_test32(dyn, ninst, rex, ed, x2, x3, x4, x5); break; case 2: INST_NAME("NOT Ed"); diff --git a/src/dynarec/arm64/dynarec_arm64_emit_tests.c b/src/dynarec/arm64/dynarec_arm64_emit_tests.c index 447ce8c7..bf190586 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_tests.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_tests.c @@ -265,8 +265,8 @@ void emit_cmp8_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4) } } -// emit TEST32 instruction, from test s1, s2, using s3 and s4 as scratch -void emit_test32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4) +// emit TEST32 instruction, from test s1, s2, using s3, s4 and s5 as scratch +void emit_test32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5) { MAYUSE(s1); MAYUSE(s2); MAYUSE(s3); MAYUSE(s4); IFX_PENDOR0 { @@ -292,18 +292,11 @@ 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) { - ANDw_mask(s3, s3, 0b011011, 0b000010); // 0xE0 - LSRw(s3, s3, 5); - MOV64x(s4, (uintptr_t)GetParityTab()); - LDRw_REG_LSL2(s4, s4, s3); - ANDw_mask(s3, s1, 0, 0b000100); // 0x1f - LSRw_REG(s4, s4, s3); - MVNx_REG(s4, s4); - BFIw(xFlags, s4, F_PF, 1); + emit_pf(dyn, ninst, s3, s4, s5); } } -// emit TEST16 instruction, from test s1, s2, using s3 and s4 as scratch +// emit TEST16 instruction, from test s1, s2, using s3, s4 and s5 as scratch void emit_test16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5) { MAYUSE(s1); MAYUSE(s2); @@ -334,7 +327,7 @@ void emit_test16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, } } -// emit TEST8 instruction, from test s1, s2, using s3 and s4 as scratch +// emit TEST8 instruction, from test s1, s2, using s3, s4 and s5 as scratch void emit_test8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5) { MAYUSE(s1); MAYUSE(s2); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index b6021585..5c7c21f3 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -1035,7 +1035,7 @@ void emit_cmp16_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4); void emit_cmp32_0(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int s4); void emit_test8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); void emit_test16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_test32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); +void emit_test32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); void emit_add32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); void emit_add32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4, int s5); void emit_add8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); -- cgit 1.4.1