about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-04-30 21:43:09 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-04-30 21:43:09 +0200
commitee58b6a7347cadb33a721dc492bb6a7cc587b2ca (patch)
tree328e1931bbacc480f912efbf1115403e1246653e /src
parent2907e5a0bd412dd9148fe7ad9ed7d3fe9919f57d (diff)
downloadbox64-ee58b6a7347cadb33a721dc492bb6a7cc587b2ca.tar.gz
box64-ee58b6a7347cadb33a721dc492bb6a7cc587b2ca.zip
[RV64_DYNAREC] Optimized F0 0F C7 32bits opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f0.c26
1 files changed, 11 insertions, 15 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c
index 5b61d340..0f9c97ea 100644
--- a/src/dynarec/rv64/dynarec_rv64_f0.c
+++ b/src/dynarec/rv64/dynarec_rv64_f0.c
@@ -323,26 +323,22 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 AMOSWAP_W(xZR, xZR, x9, 1, 1);
                             } else {
                                 SMDMB();
+                                AND(x3, xRAX, xMASK);
+                                SLLI(x2, xRDX, 32);
+                                OR(x3, x3, x2);
+                                AND(x4, xRBX, xMASK);
+                                SLLI(x2, xRCX, 32);
+                                OR(x4, x4, x2);
                                 MARKLOCK;
                                 LR_D(x2, wback, 1, 1);
-                                AND(x3, x2, xMASK);
-                                AND(x4, xRAX, xMASK);
-                                SRLI(x5, x2, 32);
-                                AND(x6, xRDX, xMASK);
-                                BNE_MARK(x3, x4); // EAX != Ed[0]
-                                BNE_MARK(x5, x6); // EDX != Ed[1]
-                                SLLI(x2, xRCX, 32);
-                                AND(x3, xRBX, xMASK);
-                                OR(x2, x2, x3);
-                                SC_D(x3, x2, wback, 1, 1);
-                                BNEZ_MARKLOCK(x3);
+                                BNE_MARK(x2, x3); // EDX_EAX != Ed
+                                SC_D(x5, x4, wback, 1, 1);
+                                BNEZ_MARKLOCK(x5);
                                 ORI(xFlags, xFlags, 1<<F_ZF);
                                 B_MARK3_nocond;
                                 MARK;
-                                ADDI(xRAX, x3, 0);
-                                ADDI(xRDX, x5, 0);
-                                AND(xRAX, xRAX, xMASK);
-                                AND(xRDX, xRDX, xMASK);
+                                SLLI(xRDX, x2, 32);
+                                AND(xRAX, x2, xMASK);
                                 MARK3;
                                 SMDMB();
                             }