about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-04-17 10:49:53 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-04-17 10:49:53 +0200
commit3b550eeed3ecd47546ad0c0664a458af463c57af (patch)
tree80bb6f9504d2add4eb1aa14589c11598f0b6343e /src
parent097c0ac0b7de7951f8149e0bd83455b1919871af (diff)
downloadbox64-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.c21
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");