about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-01-09 15:52:59 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-01-09 15:52:59 +0100
commit10effff2399c396f5dcbdf695418083e2bb45303 (patch)
treeff9224febb595a2d5e497a20b306526e8ea24f4e /src
parenta3f27f9a6305eaccf1d53f263a90aa965d0cfcb7 (diff)
downloadbox64-10effff2399c396f5dcbdf695418083e2bb45303.tar.gz
box64-10effff2399c396f5dcbdf695418083e2bb45303.zip
[DYNAREC] Small optim to F0 81/83 /0 /5 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/dynarec_arm64_f0.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/dynarec/dynarec_arm64_f0.c b/src/dynarec/dynarec_arm64_f0.c
index 74a471b4..dbcf18ea 100644
--- a/src/dynarec/dynarec_arm64_f0.c
+++ b/src/dynarec/dynarec_arm64_f0.c
@@ -675,20 +675,20 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     } else {
                         addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, (opcode==0x81)?4:1);
                         if(opcode==0x81) i64 = F32S; else i64 = F8S;
-                        MOV64xw(x5, i64);
-                        TSTx_mask(wback, 1, 0, 0);    // mask=1
+                        TSTx_mask(wback, 1, 0, 1+rex.w);    // mask=3 or 7
                         B_MARK(cNE);
                         MARKLOCK;
                         LDAXRxw(x1, wback);
-                        emit_add32(dyn, ninst, rex, x1, x5, x3, x4);
+                        emit_add32c(dyn, ninst, rex, x1, i64, x3, x4, x5);
                         STLXRxw(x3, x1, wback);
                         CBNZx_MARKLOCK(x3);
+                        DMB_ISH();
                         B_NEXT_nocond;
                         MARK;   // unaligned! also, not enough 
                         LDRxw_U12(x1, wback, 0);
                         LDAXRB(x4, wback);
                         BFIxw(x1, x4, 0, 8); // re-inject
-                        emit_add32(dyn, ninst, rex, x1, x5, x3, x4);
+                        emit_add32c(dyn, ninst, rex, x1, i64, x3, x4, x5);
                         STLXRB(x3, x1, wback);
                         CBNZx_MARK(x3);
                         STRxw_U12(x1, wback, 0);    // put the whole value
@@ -783,20 +783,20 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     } else {
                         addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, 0, (opcode==0x81)?4:1);
                         if(opcode==0x81) i64 = F32S; else i64 = F8S;
-                        MOV64xw(x5, i64);
-                        TSTx_mask(wback, 1, 0, 0);    // mask=1
+                        TSTx_mask(wback, 1, 0, 1+rex.w);    // mask=3 or 7
                         B_MARK(cNE);
                         MARKLOCK;
                         LDAXRxw(x1, wback);
-                        emit_sub32(dyn, ninst, rex, x1, x5, x3, x4);
+                        emit_sub32c(dyn, ninst, rex, x1, i64, x3, x4, x5);
                         STLXRxw(x3, x1, wback);
                         CBNZx_MARKLOCK(x3);
+                        DMB_ISH();
                         B_NEXT_nocond;
                         MARK;   // unaligned! also, not enough 
                         LDRxw_U12(x1, wback, 0);
                         LDAXRB(x4, wback);
                         BFIxw(x1, x4, 0, 8); // re-inject
-                        emit_sub32(dyn, ninst, rex, x1, x5, x3, x4);
+                        emit_sub32c(dyn, ninst, rex, x1, i64, x3, x4, x5);
                         STLXRB(x3, x1, wback);
                         CBNZx_MARK(x3);
                         STRxw_U12(x1, wback, 0);    // put the whole value