diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-22 17:35:38 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-22 17:35:38 +0100 |
| commit | 1405d83a56433080edded7ae59d01aa5eb9324c2 (patch) | |
| tree | d1e935087650c94791ba2e6d4c062dc396c59754 /src | |
| parent | 0878acf04c60772493599fa59a3eeada7fcf37c1 (diff) | |
| download | box64-1405d83a56433080edded7ae59d01aa5eb9324c2.tar.gz box64-1405d83a56433080edded7ae59d01aa5eb9324c2.zip | |
[DYNAREC] Various bugfixes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 13 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_f20f.c | 2 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_f30f.c | 23 |
3 files changed, 21 insertions, 17 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index 714bb92d..e5295b82 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -844,16 +844,12 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MOVxw_REG(ed, x1); } else { GETGD; - addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, 0, 0); - if(rex.w) { - TSTx_mask(ed, 1, 0, 2); // mask=7 - } else { - TSTw_mask(ed, 0, 1); // mask=3 - } + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, 0, 0); + TSTx_mask(ed, 1, 0, 1+rex.w); // mask=3 or 7 B_MARK(cNE); MARKLOCK; - LDAXRxw(x1, ed); - STLXRxw(x3, gd, ed); + LDXRxw(x1, ed); + STXRxw(x3, gd, ed); CBNZx_MARKLOCK(x3); B_MARK2_nocond; MARK; @@ -991,7 +987,6 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin STRxw_U12(x1, xRDI, 0); ADDx_REG(xRSI, xRSI, x3); ADDx_REG(xRDI, xRDI, x3); - SUBSx_U12(xRCX, xRCX, 1); } break; diff --git a/src/dynarec/dynarec_arm64_f20f.c b/src/dynarec/dynarec_arm64_f20f.c index 82388dd4..71e0a049 100755 --- a/src/dynarec/dynarec_arm64_f20f.c +++ b/src/dynarec/dynarec_arm64_f20f.c @@ -133,7 +133,7 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n GETGX(v0); GETEX(d0, 0); d1 = fpu_get_scratch(dyn); - FCVT_D_S(d1, d0); + FCVT_S_D(d1, d0); VMOVeS(v0, 0, d1, 0); break; diff --git a/src/dynarec/dynarec_arm64_f30f.c b/src/dynarec/dynarec_arm64_f30f.c index 13b8dc70..93c32fbb 100755 --- a/src/dynarec/dynarec_arm64_f30f.c +++ b/src/dynarec/dynarec_arm64_f30f.c @@ -29,11 +29,10 @@ } else { \ parity = getedparity(dyn, ninst, addr, nextop, 3, D); \ a = fpu_get_scratch(dyn); \ + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, D); \ if(parity) { \ - addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, D); \ VLDR32_U12(a, ed, fixedaddress); \ } else { \ - addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, D); \ LDRw_U12(x2, ed, fixedaddress); \ VMOVQSfrom(a, 0, x2); \ } \ @@ -77,10 +76,15 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VMOVeS(v0, 0, q0, 0); } else { v0 = sse_get_reg_empty(dyn, ninst, x1, gd); + parity = getedparity(dyn, ninst, addr, nextop, 3, 0); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, 0); - LDRw_U12(x2, ed, fixedaddress); // to avoid bus errors - VEORQ(v0, v0, v0); - VMOVQSfrom(v0, 0, x2); + if(parity) { + VLDR32_U12(v0, ed, fixedaddress); + } else { + LDRw_U12(x2, ed, fixedaddress); // to avoid bus errors + VEORQ(v0, v0, v0); + VMOVQSfrom(v0, 0, x2); + } } break; case 0x11: @@ -92,9 +96,14 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n q0 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3)); VMOVeS(q0, 0, v0, 0); } else { - VMOVSto(x2, v0, 0); + parity = getedparity(dyn, ninst, addr, nextop, 3, 0); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, 0); - STRw_U12(x2, ed, fixedaddress); + if(parity) { + VSTR32_U12(v0, ed, fixedaddress); + } else { + VMOVSto(x2, v0, 0); + STRw_U12(x2, ed, fixedaddress); + } } break; |