about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-11-24 15:49:02 +0800
committerGitHub <noreply@github.com>2024-11-24 08:49:02 +0100
commitb0c10c9ae5938302b2bb9c941ba2a15e15d61be0 (patch)
tree2d623a938695947c59938eb6db710c0789ab14b5 /src
parentb8ed1b964693c4f17d44f0da3b1536afce409c8f (diff)
downloadbox64-b0c10c9ae5938302b2bb9c941ba2a15e15d61be0.tar.gz
box64-b0c10c9ae5938302b2bb9c941ba2a15e15d61be0.zip
[RV64_DYNAREC] Minor optimizations on CMPXCHG (#2062)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f0.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c
index 05242ef3..10d5231f 100644
--- a/src/dynarec/rv64/dynarec_rv64_f0.c
+++ b/src/dynarec/rv64/dynarec_rv64_f0.c
@@ -110,8 +110,7 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     wback = xRAX+(wback&3);
                                 }
                                 if (wb2) {
-                                    MV(x2, wback);
-                                    SRLI(x2, x2, wb2);
+                                    SRLI(x2, wback, wb2);
                                     ANDI(x2, x2, 0xff);
                                 } else {
                                     ANDI(x2, wback, 0xff);
@@ -123,8 +122,7 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 }
                                 BNE_MARK2(x6, x2);
                                 if (wb2) {
-                                    MV(wback, x2);
-                                    SRLI(wback, wback, wb2);
+                                    SRLI(wback, x2, wb2);
                                     ANDI(wback, wback, 0xff);
                                 } else {
                                     ANDI(wback, x2, 0xff);
@@ -136,9 +134,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 OR(xRAX, xRAX, x2);
                                 B_NEXT_nocond;
                             } else {
-                                // this one is tricky, and did some repetitive work.
-                                // mostly because we only got 6 scratch registers,
-                                // and has so much to do.
                                 if(rex.rex) {
                                     gb1 = xRAX+((nextop&0x38)>>3)+(rex.r<<3);
                                     gb2 = 0;
@@ -163,8 +158,7 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 NOT(x2, x2);
                                 AND(x2, x1, x2);
                                 if (gb2) {
-                                    MV(x1, gb1);
-                                    SRLI(x1, x1, 8);
+                                    SRLI(x1, gb1, 8);
                                     ANDI(x1, x1, 0xff);
                                 } else {
                                     ANDI(x1, gb1, 0xff);