about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c12
-rw-r--r--src/dynarec/rv64/rv64_emitter.h8
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))