about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-10-20 05:05:47 +0800
committerGitHub <noreply@github.com>2025-10-19 23:05:47 +0200
commitb0c11ae14f59346e3348a3c66823cbac52aad835 (patch)
tree4a52c16d98d5aca71a8936ca10530ec503f34be5
parent2db2532092029ab62575bbec1fb560d7839ff9cb (diff)
downloadbox64-b0c11ae14f59346e3348a3c66823cbac52aad835.tar.gz
box64-b0c11ae14f59346e3348a3c66823cbac52aad835.zip
[LA64_DYNAREC] Added more opcodes (#3079)
-rw-r--r--src/dynarec/la64/dynarec_la64_00.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c
index 74a543b5..f3c44ce1 100644
--- a/src/dynarec/la64/dynarec_la64_00.c
+++ b/src/dynarec/la64/dynarec_la64_00.c
@@ -3,6 +3,7 @@
 #include <stddef.h>
 #include <errno.h>
 
+#include "la64_mapping.h"
 #include "x64_signals.h"
 #include "os.h"
 #include "debug.h"
@@ -1259,6 +1260,24 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 jump_to_epilog(dyn, addr, 0, ninst);
             }
             break;
+        case 0x9E:
+            INST_NAME("SAHF");
+            SETFLAGS(X_CF | X_PF | X_AF | X_ZF | X_SF, SF_SUBSET, NAT_FLAGS_NOFUSION);
+            ADDI_D(x1, xZR, ~0b11010101);
+            AND(xFlags, xFlags, x1);
+            NOR(x1, x1, x1);
+            SRLI_D(x2, xRAX, 8);
+            AND(x1, x1, x2);
+            OR(xFlags, xFlags, x1);
+            SPILL_EFLAGS();
+            SET_DFNONE();
+            break;
+        case 0x9F:
+            INST_NAME("LAHF");
+            READFLAGS(X_CF | X_PF | X_AF | X_ZF | X_SF);
+            RESTORE_EFLAGS(x1);
+            BSTRINS_D(xRAX, xFlags, 15, 8);
+            break;
         case 0xA0:
             INST_NAME("MOV AL,Ob");
             if (rex.is32bits)