diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-08-09 11:51:24 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-09 11:51:24 +0200 |
| commit | 4474af2a9af0a4c01cf744070e998f6fc15388e7 (patch) | |
| tree | 82ad5a975c2377476232058233f6daa423be32c9 /src | |
| parent | adaafc2a6d061581e16962a9035b5d8637777290 (diff) | |
| parent | a3765ec0f86695ecb0d2ac644d98cbc1a57bfa64 (diff) | |
| download | box64-4474af2a9af0a4c01cf744070e998f6fc15388e7.tar.gz box64-4474af2a9af0a4c01cf744070e998f6fc15388e7.zip | |
Merge pull request #928 from wannacu/main
[ARM64_DYNAREC] Correct PF caculation
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 6 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_emit_tests.c | 17 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 1 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 1 |
8 files changed, 17 insertions, 18 deletions
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); diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index fc2c6348..db5e8e08 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -2175,6 +2175,7 @@ #() vFppCuupp #() vFppuiiip #() vFppuupii +#() vFppUuupp #() vFppddddu #() vFppddpiu #() vFpplpppi diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index cb85dc83..6ed5bbc8 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -2211,6 +2211,7 @@ typedef void (*vFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*); typedef void (*vFppCuupp_t)(void*, void*, uint8_t, uint32_t, uint32_t, void*, void*); typedef void (*vFppuiiip_t)(void*, void*, uint32_t, int32_t, int32_t, int32_t, void*); typedef void (*vFppuupii_t)(void*, void*, uint32_t, uint32_t, void*, int32_t, int32_t); +typedef void (*vFppUuupp_t)(void*, void*, uint64_t, uint32_t, uint32_t, void*, void*); typedef void (*vFppddddu_t)(void*, void*, double, double, double, double, uint32_t); typedef void (*vFppddpiu_t)(void*, void*, double, double, void*, int32_t, uint32_t); typedef void (*vFpplpppi_t)(void*, void*, intptr_t, void*, void*, void*, int32_t); @@ -3788,6 +3789,7 @@ void vFppip(x64emu_t *emu, uintptr_t fcn) { vFppip_t fn = (vFppip_t)fcn; fn((voi void vFppui(x64emu_t *emu, uintptr_t fcn) { vFppui_t fn = (vFppui_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (int32_t)R_RCX); } void vFppuu(x64emu_t *emu, uintptr_t fcn) { vFppuu_t fn = (vFppuu_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (uint32_t)R_RCX); } void vFppup(x64emu_t *emu, uintptr_t fcn) { vFppup_t fn = (vFppup_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (void*)R_RCX); } +void vFppUu(x64emu_t *emu, uintptr_t fcn) { vFppUu_t fn = (vFppUu_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint64_t)R_RDX, (uint32_t)R_RCX); } void vFppfi(x64emu_t *emu, uintptr_t fcn) { vFppfi_t fn = (vFppfi_t)fcn; fn((void*)R_RDI, (void*)R_RSI, emu->xmm[0].f[0], (int32_t)R_RDX); } void vFppff(x64emu_t *emu, uintptr_t fcn) { vFppff_t fn = (vFppff_t)fcn; fn((void*)R_RDI, (void*)R_RSI, emu->xmm[0].f[0], emu->xmm[1].f[0]); } void vFppdu(x64emu_t *emu, uintptr_t fcn) { vFppdu_t fn = (vFppdu_t)fcn; fn((void*)R_RDI, (void*)R_RSI, emu->xmm[0].d[0], (uint32_t)R_RDX); } @@ -5108,6 +5110,7 @@ void vFppipppp(x64emu_t *emu, uintptr_t fcn) { vFppipppp_t fn = (vFppipppp_t)fcn void vFppCuupp(x64emu_t *emu, uintptr_t fcn) { vFppCuupp_t fn = (vFppCuupp_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint8_t)R_RDX, (uint32_t)R_RCX, (uint32_t)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); } void vFppuiiip(x64emu_t *emu, uintptr_t fcn) { vFppuiiip_t fn = (vFppuiiip_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(void**)(R_RSP + 8)); } void vFppuupii(x64emu_t *emu, uintptr_t fcn) { vFppuupii_t fn = (vFppuupii_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (uint32_t)R_RCX, (void*)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8)); } +void vFppUuupp(x64emu_t *emu, uintptr_t fcn) { vFppUuupp_t fn = (vFppUuupp_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint64_t)R_RDX, (uint32_t)R_RCX, (uint32_t)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); } void vFppddddu(x64emu_t *emu, uintptr_t fcn) { vFppddddu_t fn = (vFppddddu_t)fcn; fn((void*)R_RDI, (void*)R_RSI, emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0], emu->xmm[3].d[0], (uint32_t)R_RDX); } void vFppddpiu(x64emu_t *emu, uintptr_t fcn) { vFppddpiu_t fn = (vFppddpiu_t)fcn; fn((void*)R_RDI, (void*)R_RSI, emu->xmm[0].d[0], emu->xmm[1].d[0], (void*)R_RDX, (int32_t)R_RCX, (uint32_t)R_R8); } void vFpplpppi(x64emu_t *emu, uintptr_t fcn) { vFpplpppi_t fn = (vFpplpppi_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (intptr_t)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(int32_t*)(R_RSP + 8)); } @@ -6569,6 +6572,7 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &vFppui) return 1; if (fun == &vFppuu) return 1; if (fun == &vFppup) return 1; + if (fun == &vFppUu) return 1; if (fun == &vFppfi) return 2; if (fun == &vFppff) return 3; if (fun == &vFppdu) return 2; diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index d8a1fa40..67b07f74 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -2212,6 +2212,7 @@ void vFppipppp(x64emu_t *emu, uintptr_t fnc); void vFppCuupp(x64emu_t *emu, uintptr_t fnc); void vFppuiiip(x64emu_t *emu, uintptr_t fnc); void vFppuupii(x64emu_t *emu, uintptr_t fnc); +void vFppUuupp(x64emu_t *emu, uintptr_t fnc); void vFppddddu(x64emu_t *emu, uintptr_t fnc); void vFppddpiu(x64emu_t *emu, uintptr_t fnc); void vFpplpppi(x64emu_t *emu, uintptr_t fnc); |