diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-17 10:49:53 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-17 10:49:53 +0200 |
| commit | 3b550eeed3ecd47546ad0c0664a458af463c57af (patch) | |
| tree | 80bb6f9504d2add4eb1aa14589c11598f0b6343e /src | |
| parent | 097c0ac0b7de7951f8149e0bd83455b1919871af (diff) | |
| download | box64-3b550eeed3ecd47546ad0c0664a458af463c57af.tar.gz box64-3b550eeed3ecd47546ad0c0664a458af463c57af.zip | |
[DYNAREC] Hack to handle FLD/FSTP tbytes sequence faster
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/dynarec_arm64_db.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/dynarec/dynarec_arm64_db.c b/src/dynarec/dynarec_arm64_db.c index 23a6926a..a54296bb 100644 --- a/src/dynarec/dynarec_arm64_db.c +++ b/src/dynarec/dynarec_arm64_db.c @@ -265,12 +265,25 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: INST_NAME("FLD tbyte"); - x87_do_push_empty(dyn, ninst, x1); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, 0, 0); - if(ed!=x1) { - MOVx_REG(x1, ed); + if(PK(0)==0xDB && ((PK(1)>>3)&7)==7) { + // 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 + nextop = F8; //modrm + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, 0, 0); + STRx_U12(x5, ed, 0); + STRH_U12(x6, ed, 8); + } else { + if(ed!=x1) { + MOVx_REG(x1, ed); + } + x87_do_push_empty(dyn, ninst, x3); + CALL(arm_fld, -1); } - CALL(arm_fld, -1); break; case 7: INST_NAME("FSTP tbyte"); |