diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-08-29 05:06:29 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-28 23:06:29 +0200 |
| commit | 0450371e282bd5c4dbbceaeca590626304609036 (patch) | |
| tree | d2e139298b46342973d288960a58ad9cbdcaa45c /src | |
| parent | d9e5f8183f78c5f3035d3abf12e367cf05a1d4b5 (diff) | |
| download | box64-0450371e282bd5c4dbbceaeca590626304609036.tar.gz box64-0450371e282bd5c4dbbceaeca590626304609036.zip | |
[RV64_DYNAREC] Fixed a falsy optimization, better EMIT macro (#1769)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_jmpnext.c | 8 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_jmpnext.c | 8 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_2.c | 5 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 21 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_jmpnext.c | 8 |
5 files changed, 36 insertions, 14 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_jmpnext.c b/src/dynarec/arm64/dynarec_arm64_jmpnext.c index c40dfb1e..aac633e6 100644 --- a/src/dynarec/arm64/dynarec_arm64_jmpnext.c +++ b/src/dynarec/arm64/dynarec_arm64_jmpnext.c @@ -2,10 +2,14 @@ #include "arm64_emitter.h" -#define EMIT(A) *block = (A); ++block +#define EMIT(A) \ + do { \ + *block = (A); \ + ++block; \ + } while (0) void CreateJmpNext(void* addr, void* next) { uint32_t* block = (uint32_t*)addr; LDRx_literal(x2, (intptr_t)next - (intptr_t)addr); BR(x2); -} \ No newline at end of file +} diff --git a/src/dynarec/la64/dynarec_la64_jmpnext.c b/src/dynarec/la64/dynarec_la64_jmpnext.c index 793eb729..abb49ff9 100644 --- a/src/dynarec/la64/dynarec_la64_jmpnext.c +++ b/src/dynarec/la64/dynarec_la64_jmpnext.c @@ -2,7 +2,11 @@ #include "la64_emitter.h" -#define EMIT(A) *block = (A); ++block; +#define EMIT(A) \ + do { \ + *block = (A); \ + ++block; \ + } while (0) void CreateJmpNext(void* addr, void* next) { uint32_t* block = (uint32_t*)addr; @@ -10,4 +14,4 @@ void CreateJmpNext(void* addr, void* next) PCADDU12I(x2, SPLIT20(diff)); LD_D(x2, x2, SPLIT12(diff)); BR(x2); -} \ No newline at end of file +} diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c index e4eb7aa4..7339963f 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_2.c +++ b/src/dynarec/rv64/dynarec_rv64_00_2.c @@ -423,7 +423,10 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int DEFAULT; } else { // mem <= reg addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 0, 0); - if (gd != ed) MV(gd, ed); + if (gd != ed) { MV(gd, ed); } + if (!rex.w || rex.is32bits) { + ZEROUP(gd); // truncate the higher 32bits as asked + } } break; case 0x8E: diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index f46a8690..5b9a04eb 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -195,8 +195,9 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ if((sib>>6)) { SLLI(ret, xRAX + sib_reg, sib >> 6); ADDW(ret, ret, scratch); - } else + } else { ADDW(ret, xRAX+sib_reg, scratch); + } ZEROUP(ret); } else { if(sib>>6) @@ -217,8 +218,9 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ if((sib>>6)) { SLLI(ret, xRAX + sib_reg, (sib >> 6)); ADDW(ret, ret, xRAX + sib_reg2); - } else + } else { ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg); + } ZEROUP(ret); } else { ret = xRAX+sib_reg2; @@ -257,8 +259,9 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ if(sib>>6) { SLLI(ret, xRAX + sib_reg, (sib >> 6)); ADDW(ret, ret, xRAX + sib_reg2); - } else + } else { ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg); + } ZEROUP(ret); } else { ret = xRAX+sib_reg2; @@ -337,8 +340,9 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop if((sib>>6)) { SLLI(ret, xRAX + sib_reg, sib >> 6); ADDW(ret, ret, scratch); - } else + } else { ADDW(ret, xRAX+sib_reg, scratch); + } ZEROUP(ret); } else { if(sib>>6) @@ -359,8 +363,9 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop if((sib>>6)) { SLLI(ret, xRAX + sib_reg, (sib >> 6)); ADDW(ret, ret, xRAX + sib_reg2); - } else + } else { ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg); + } ZEROUP(ret); } else { ret = xRAX+sib_reg2; @@ -402,8 +407,9 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop if(sib>>6) { SLLI(ret, xRAX + sib_reg, (sib >> 6)); ADDW(ret, ret, xRAX + sib_reg2); - } else + } else { ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg); + } ZEROUP(ret); } else { ret = xRAX+sib_reg2; @@ -2455,8 +2461,9 @@ void rv64_move32(dynarec_rv64_t* dyn, int ninst, int reg, int32_t val, int zerou src = reg; } if (lo12 || !hi20) ADDIW(reg, src, lo12); - if (zeroup && (val & 0x80000000)) + if (zeroup && (val & 0x80000000)) { ZEROUP(reg); + } } void rv64_move64(dynarec_rv64_t* dyn, int ninst, int reg, int64_t val) diff --git a/src/dynarec/rv64/dynarec_rv64_jmpnext.c b/src/dynarec/rv64/dynarec_rv64_jmpnext.c index 9150dd44..4c6d42a9 100644 --- a/src/dynarec/rv64/dynarec_rv64_jmpnext.c +++ b/src/dynarec/rv64/dynarec_rv64_jmpnext.c @@ -2,7 +2,11 @@ #include "rv64_emitter.h" -#define EMIT(A) *block = (A); ++block +#define EMIT(A) \ + do { \ + *block = (A); \ + ++block; \ + } while (0) void CreateJmpNext(void* addr, void* next) { uint32_t* block = (uint32_t*)addr; @@ -16,4 +20,4 @@ void CreateJmpNext(void* addr, void* next) LR_D(x2, x2, 1, 1); #endif BR(x2); -} \ No newline at end of file +} |