about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-05-28 21:34:37 +0800
committerGitHub <noreply@github.com>2025-05-28 15:34:37 +0200
commit67f7c988d547c86e65794505cce11196c37aae93 (patch)
tree7f128303abbd3f8e3e6cc58b75cab8f7d0a754a4 /src
parent01da6215de69f0c61c59b8b494e4fb293fc29f02 (diff)
downloadbox64-67f7c988d547c86e65794505cce11196c37aae93.tar.gz
box64-67f7c988d547c86e65794505cce11196c37aae93.zip
[ARM64_DYNAREC] Small optim to modreg CMPXCHG (#2680)
* [ARM64_DYNAREC] Small optim to modreg CMPXCHG

* review
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c14
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c14
2 files changed, 15 insertions, 13 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index f6535005..e8bd9b9e 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -2086,11 +2086,13 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             if(MODREG) {

                 ed = TO_NAT((nextop & 7) + (rex.b << 3));

                 wback = 0;

-                UFLAG_IF {emit_cmp32(dyn, ninst, rex, xRAX, ed, x3, x4, x5);}

-                MOVxw_REG(x1, ed);  // save value

-                SUBxw_REG(x4, xRAX, x1);

-                CBNZxw_MARK(x4);

-                MOVxw_REG(ed, gd);

+                UFLAG_IF {

+                    emit_cmp32(dyn, ninst, rex, xRAX, ed, x3, x4, x5);

+                } else {

+                    CMPSxw_REG(xRAX, ed);

+                }

+                MOVxw_REG(x1, ed); // save value

+                CSELxw(ed, gd, ed, cEQ);

             } else {

                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, NULL, 0, 0);

                 LDxw(x1, wback, fixedaddress);

@@ -2099,8 +2101,8 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 CBNZxw_MARK(x4);

                 // EAX == Ed

                 STxw(gd, wback, fixedaddress);

+                MARK;

             }

-            MARK;

             MOVxw_REG(xRAX, x1);    // upper part of RAX will be erase on 32bits, no mater what

             break;

 

diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c
index c186f811..4a72e98e 100644
--- a/src/dynarec/arm64/dynarec_arm64_f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_f0.c
@@ -327,14 +327,14 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             if(MODREG) {
                                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
                                 wback = 0;
-                                UFLAG_IF {emit_cmp32(dyn, ninst, rex, xRAX, ed, x3, x4, x5);}
-                                MOVxw_REG(x1, ed);  // save value
-                                SUBxw_REG(x3, xRAX, x1);
-                                CBNZxw_MARK2(x3);
-                                MOVxw_REG(ed, gd);
-                                MARK2;
+                                UFLAG_IF {
+                                    emit_cmp32(dyn, ninst, rex, xRAX, ed, x3, x4, x5);
+                                } else {
+                                    CMPSxw_REG(xRAX, ed);
+                                }
+                                MOVxw_REG(x1, ed); // save value
+                                CSELxw(ed, gd, ed, cEQ);
                                 MOVxw_REG(xRAX, x1);
-                                B_NEXT_nocond;
                             } else {
                                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
                                 if(!ALIGNED_ATOMICxw) {