diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-17 10:09:59 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-17 10:09:59 +0200 |
| commit | 8d199cfc6cd991d386f99e158c52e9e78988b15e (patch) | |
| tree | f4940c13c457268cc13b99e898805cc49d0aeca1 /src | |
| parent | ffa58e23f1c846cb1bb072a34d402f8c77bf02c5 (diff) | |
| download | box64-8d199cfc6cd991d386f99e158c52e9e78988b15e.tar.gz box64-8d199cfc6cd991d386f99e158c52e9e78988b15e.zip | |
[ARM64_DYNAREC] Minor adjustments to a few complex x87 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_db.c | 11 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_df.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 2 |
3 files changed, 10 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_db.c b/src/dynarec/arm64/dynarec_arm64_db.c index d9aa8e31..488d18d4 100644 --- a/src/dynarec/arm64/dynarec_arm64_db.c +++ b/src/dynarec/arm64/dynarec_arm64_db.c @@ -271,14 +271,15 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 5: INST_NAME("FLD tbyte"); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); - if((PK(0)==0xDB && ((PK(1)>>3)&7)==7) || (PK(0)>=0x40 && PK(0)<=0x4f && PK(1)==0xDB && ((PK(2)>>3)&7)==7)) { + if((PK(0)==0xDB && ((PK(1)>>3)&7)==7) || (!rex.is32bits && PK(0)>=0x40 && PK(0)<=0x4f && PK(1)==0xDB && ((PK(2)>>3)&7)==7)) { + NOTEST(x5); // the FLD is immediatly followed by an FSTP LDRx_U12(x5, ed, 0); LDRH_U12(x6, ed, 8); // no persistant scratch register, so unrool both instruction here... MESSAGE(LOG_DUMP, "\tHack: FSTP tbyte\n"); nextop = F8; // 0xDB or rex - if(nextop>=0x40 && nextop<=0x4f) { + if(!rex.is32bits && nextop>=0x40 && nextop<=0x4f) { rex.rex = nextop; nextop = F8; //0xDB } else @@ -295,8 +296,12 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if(ed!=x1) { MOVx_REG(x1, ed); } - X87_PUSH_EMPTY_OR_FAIL(dyn, ninst, x3); + X87_PUSH_EMPTY_OR_FAIL(dyn, ninst, 0); + // sync top + s0 = x87_stackcount(dyn, ninst, x3); CALL(native_fld, -1); + // go back with the top & stack counter + x87_unstackcount(dyn, ninst, x3, s0); } } break; diff --git a/src/dynarec/arm64/dynarec_arm64_df.c b/src/dynarec/arm64/dynarec_arm64_df.c index a2748071..21828508 100644 --- a/src/dynarec/arm64/dynarec_arm64_df.c +++ b/src/dynarec/arm64/dynarec_arm64_df.c @@ -273,7 +273,9 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin X87_PUSH_EMPTY_OR_FAIL(dyn, ninst, x1); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); if(ed!=x1) {MOVx_REG(x1, ed);} + s0 = x87_stackcount(dyn, ninst, x3); CALL(fpu_fbld, -1); + x87_unstackcount(dyn, ninst, x3, s0); break; case 5: INST_NAME("FILD ST0, i64"); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 2d53ce59..cd54c728 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -996,8 +996,6 @@ void x87_do_push_empty(dynarec_arm_t* dyn, int ninst, int s1) MESSAGE(LOG_DUMP, "Incoherent x87 stack cache, aborting\n"); dyn->abort = 1; } - if(s1) - x87_stackcount(dyn, ninst, s1); } void static internal_x87_dopop(dynarec_arm_t* dyn) { |