diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-05-28 21:34:37 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-28 15:34:37 +0200 |
| commit | 67f7c988d547c86e65794505cce11196c37aae93 (patch) | |
| tree | 7f128303abbd3f8e3e6cc58b75cab8f7d0a754a4 /src | |
| parent | 01da6215de69f0c61c59b8b494e4fb293fc29f02 (diff) | |
| download | box64-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.c | 14 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f0.c | 14 |
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) { |