diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 12 | ||||
| -rw-r--r-- | src/dynarec/rv64/rv64_emitter.h | 8 |
2 files changed, 11 insertions, 9 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index e9958323..361844bb 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -2414,15 +2414,9 @@ static void swapCache(dynarec_rv64_t* dyn, int ninst, int i, int j, extcache_t* // There is no swap instruction in RV64 to swap 2 float registers! // so use a scratch... #define SCRATCH 0 // f0 is not used anywhere else - if (i_single) { - FMVS(SCRATCH, reg_i); - FMVS(reg_i, reg_j); - FMVS(reg_j, SCRATCH); - } else { - FMVD(SCRATCH, reg_i); - FMVD(reg_i, reg_j); - FMVD(reg_j, SCRATCH); - } + FMV(SCRATCH, reg_i, i_single); + FMV(reg_i, reg_j, j_single); + FMV(reg_j, SCRATCH, i_single); #undef SCRATCH tmp.v = cache->extcache[i].v; cache->extcache[i].v = cache->extcache[j].v; diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h index 31a6c290..e274d9af 100644 --- a/src/dynarec/rv64/rv64_emitter.h +++ b/src/dynarec/rv64/rv64_emitter.h @@ -756,6 +756,14 @@ // Convert from Double to unsigned integer #define FCVTLUDxw(rd, frs1, rm) EMIT(R_type(0b1100001, 0b00001 + (rex.w ? 0b10 : 0b00), frs1, rm, rd, 0b1010011)) +#define FMV(frd, frs1, single) \ + do { \ + if (single) \ + FMVS(frd, frs1); \ + else \ + FMVD(frd, frs1); \ + } while (0) + // Zba // Add unsigned word (Wz(rs1) + X(rs2)) #define ADDUW(rd, rs1, rs2) EMIT(R_type(0b0000100, rs2, rs1, 0b000, rd, 0b0111011)) |