about summary refs log tree commit diff stats
path: root/src/dynarec/rv64/rv64_emitter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynarec/rv64/rv64_emitter.h')
-rw-r--r--src/dynarec/rv64/rv64_emitter.h10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h
index 8bdca605..fecfef4d 100644
--- a/src/dynarec/rv64/rv64_emitter.h
+++ b/src/dynarec/rv64/rv64_emitter.h
@@ -821,7 +821,15 @@ f28–31  ft8–11  FP temporaries                  Caller
 // Sign-extend byte
 #define SEXTB(rd, rs) EMIT(R_type(0b0110000, 0b00100, rs, 0b001, rd, 0b0010011))
 // Sign-extend half-word
-#define SEXTH(rd, rs) EMIT(R_type(0b0110000, 0b00101, rs, 0b001, rd, 0b0010011))
+#define SEXTH_(rd, rs) EMIT(R_type(0b0110000, 0b00101, rs, 0b001, rd, 0b0010011))
+// Sign-extend half-word
+#define SEXTH(rd, rs)     \
+    if (rv64_zbb)         \
+        SEXTH_(rd, rs);   \
+    else {                \
+        SLLI(rd, rs, 48); \
+        SRAI(rd, rd, 48); \
+    }
 // Zero-extend half-word
 #define ZEXTH_(rd, rs) EMIT(R_type(0b0000100, 0b00000, rs, 0b100, rd, 0b0111011))
 // Zero-extend half-word