target/i386: emulate: more 64-bit register handling
Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr> Link: https://lore.kernel.org/r/20260228214704.19048-6-mohamed@unpredictable.fr Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Mohamed Mediouni committed
Feb 28, 2026 at 22:47 UTC
7f7e797737eb1965bdf2260d10e6819a3998d28d
3 files changed
+84
target/i386/emulate/x86_emu.c
+17
@@ -45,6 +45,22 @@
45
#include "x86_mmu.h"
46
47
48
+#ifdef TARGET_X86_64
49
+#define EXEC_2OP_FLAGS_CMD_64(env, decode, cmd, FLAGS_FUNC, save_res) \
50
+ case 8: \
51
+ { \
52
+ uint64_t v1 = (uint64_t)decode->op[0].val; \
53
+ uint64_t v2 = (uint64_t)decode->op[1].val; \
54
+ uint64_t diff = v1 cmd v2; \
55
+ if (save_res) { \
56
+ if (write_val_ext(env, &decode->op[0], diff, 8)) { return 1; } \
57
+ } \
58
+ FLAGS_FUNC##64(env, v1, v2, diff); \
59
+ break; \
60
+ }
61
+#else
62
+#define EXEC_2OP_FLAGS_CMD_64(env, decode, cmd, FLAGS_FUNC, save_res)
63
+#endif
64
#define EXEC_2OP_FLAGS_CMD(env, decode, cmd, FLAGS_FUNC, save_res) \
65
{ \
66
if (fetch_operands(env, decode, 2, true, true, false)) {\
@@ -84,6 +100,7 @@
100
FLAGS_FUNC##32(env, v1, v2, diff); \
101
break; \
102
} \
103
+ EXEC_2OP_FLAGS_CMD_64(env, decode, cmd, FLAGS_FUNC, save_res) \
104
default: \
105
VM_PANIC("bad size\n"); \
106
} \
target/i386/emulate/x86_flags.c
+47
@@ -82,6 +82,10 @@
82
SET_FLAGS_OSZAPC_SIZE(16, carries, result)
83
#define SET_FLAGS_OSZAPC_32(carries, result) \
84
SET_FLAGS_OSZAPC_SIZE(32, carries, result)
85
+#ifdef TARGET_X86_64
86
+#define SET_FLAGS_OSZAPC_64(carries, result) \
87
+ SET_FLAGS_OSZAPC_SIZE(64, carries, result)
88
+#endif
89
90
/* ******************* */
91
/* OSZAP */
@@ -107,6 +111,10 @@
111
SET_FLAGS_OSZAP_SIZE(16, carries, result)
112
#define SET_FLAGS_OSZAP_32(carries, result) \
113
SET_FLAGS_OSZAP_SIZE(32, carries, result)
114
+#ifdef TARGET_X86_64
115
+#define SET_FLAGS_OSZAP_64(carries, result) \
116
+ SET_FLAGS_OSZAP_SIZE(64, carries, result)
117
+#endif
118
119
void SET_FLAGS_OxxxxC(CPUX86State *env, bool new_of, bool new_cf)
120
{
@@ -115,6 +123,14 @@ void SET_FLAGS_OxxxxC(CPUX86State *env, bool new_of, bool new_cf)
123
env->cc_src ^= ((target_ulong)new_of << LF_BIT_PO);
124
}
125
126
+#ifdef TARGET_X86_64
127
+void SET_FLAGS_OSZAPC_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2,
128
+ uint64_t diff)
129
+{
130
+ SET_FLAGS_OSZAPC_64(SUB_COUT_VEC(v1, v2, diff), diff);
131
+}
132
+#endif
133
+
134
void SET_FLAGS_OSZAPC_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2,
135
uint32_t diff)
136
{
@@ -133,6 +149,14 @@ void SET_FLAGS_OSZAPC_SUB8(CPUX86State *env, uint8_t v1, uint8_t v2,
149
SET_FLAGS_OSZAPC_8(SUB_COUT_VEC(v1, v2, diff), diff);
150
}
151
152
+#ifdef TARGET_X86_64
153
+void SET_FLAGS_OSZAPC_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2,
154
+ uint64_t diff)
155
+{
156
+ SET_FLAGS_OSZAPC_64(ADD_COUT_VEC(v1, v2, diff), diff);
157
+}
158
+#endif
159
+
160
void SET_FLAGS_OSZAPC_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2,
161
uint32_t diff)
162
{
@@ -151,6 +175,14 @@ void SET_FLAGS_OSZAPC_ADD8(CPUX86State *env, uint8_t v1, uint8_t v2,
175
SET_FLAGS_OSZAPC_8(ADD_COUT_VEC(v1, v2, diff), diff);
176
}
177
178
+#ifdef TARGET_X86_64
179
+void SET_FLAGS_OSZAP_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2,
180
+ uint64_t diff)
181
+{
182
+ SET_FLAGS_OSZAP_64(SUB_COUT_VEC(v1, v2, diff), diff);
183
+}
184
+#endif
185
+
186
void SET_FLAGS_OSZAP_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2,
187
uint32_t diff)
188
{
@@ -169,6 +201,14 @@ void SET_FLAGS_OSZAP_SUB8(CPUX86State *env, uint8_t v1, uint8_t v2,
201
SET_FLAGS_OSZAP_8(SUB_COUT_VEC(v1, v2, diff), diff);
202
}
203
204
+#ifdef TARGET_X86_64
205
+void SET_FLAGS_OSZAP_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2,
206
+ uint64_t diff)
207
+{
208
+ SET_FLAGS_OSZAP_64(ADD_COUT_VEC(v1, v2, diff), diff);
209
+}
210
+#endif
211
+
212
void SET_FLAGS_OSZAP_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2,
213
uint32_t diff)
214
{
@@ -187,6 +227,13 @@ void SET_FLAGS_OSZAP_ADD8(CPUX86State *env, uint8_t v1, uint8_t v2,
227
SET_FLAGS_OSZAP_8(ADD_COUT_VEC(v1, v2, diff), diff);
228
}
229
230
+#ifdef TARGET_X86_64
231
+void SET_FLAGS_OSZAPC_LOGIC64(CPUX86State *env, uint64_t v1, uint64_t v2,
232
+ uint64_t diff)
233
+{
234
+ SET_FLAGS_OSZAPC_64(0, diff);
235
+}
236
+#endif
237
238
void SET_FLAGS_OSZAPC_LOGIC32(CPUX86State *env, uint32_t v1, uint32_t v2,
239
uint32_t diff)
target/i386/emulate/x86_flags.h
+20
@@ -33,6 +33,10 @@ void set_CF(CPUX86State *env, bool val);
33
34
void SET_FLAGS_OxxxxC(CPUX86State *env, bool new_of, bool new_cf);
35
36
+#ifdef TARGET_X86_64
37
+void SET_FLAGS_OSZAPC_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2,
38
+ uint64_t diff);
39
+#endif
40
void SET_FLAGS_OSZAPC_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2,
41
uint32_t diff);
42
void SET_FLAGS_OSZAPC_SUB16(CPUX86State *env, uint16_t v1, uint16_t v2,
@@ -40,6 +44,10 @@ void SET_FLAGS_OSZAPC_SUB16(CPUX86State *env, uint16_t v1, uint16_t v2,
44
void SET_FLAGS_OSZAPC_SUB8(CPUX86State *env, uint8_t v1, uint8_t v2,
45
uint8_t diff);
46
47
+#ifdef TARGET_X86_64
48
+void SET_FLAGS_OSZAPC_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2,
49
+ uint64_t diff);
50
+#endif
51
void SET_FLAGS_OSZAPC_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2,
52
uint32_t diff);
53
void SET_FLAGS_OSZAPC_ADD16(CPUX86State *env, uint16_t v1, uint16_t v2,
@@ -47,6 +55,10 @@ void SET_FLAGS_OSZAPC_ADD16(CPUX86State *env, uint16_t v1, uint16_t v2,
55
void SET_FLAGS_OSZAPC_ADD8(CPUX86State *env, uint8_t v1, uint8_t v2,
56
uint8_t diff);
57
58
+#ifdef TARGET_X86_64
59
+void SET_FLAGS_OSZAP_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2,
60
+ uint64_t diff);
61
+#endif
62
void SET_FLAGS_OSZAP_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2,
63
uint32_t diff);
64
void SET_FLAGS_OSZAP_SUB16(CPUX86State *env, uint16_t v1, uint16_t v2,
@@ -54,6 +66,10 @@ void SET_FLAGS_OSZAP_SUB16(CPUX86State *env, uint16_t v1, uint16_t v2,
66
void SET_FLAGS_OSZAP_SUB8(CPUX86State *env, uint8_t v1, uint8_t v2,
67
uint8_t diff);
68
69
+#ifdef TARGET_X86_64
70
+void SET_FLAGS_OSZAP_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2,
71
+ uint64_t diff);
72
+#endif
73
void SET_FLAGS_OSZAP_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2,
74
uint32_t diff);
75
void SET_FLAGS_OSZAP_ADD16(CPUX86State *env, uint16_t v1, uint16_t v2,
@@ -61,6 +77,10 @@ void SET_FLAGS_OSZAP_ADD16(CPUX86State *env, uint16_t v1, uint16_t v2,
77
void SET_FLAGS_OSZAP_ADD8(CPUX86State *env, uint8_t v1, uint8_t v2,
78
uint8_t diff);
79
80
+#ifdef TARGET_X86_64
81
+void SET_FLAGS_OSZAPC_LOGIC64(CPUX86State *env, uint64_t v1, uint64_t v2,
82
+ uint64_t diff);
83
+#endif
84
void SET_FLAGS_OSZAPC_LOGIC32(CPUX86State *env, uint32_t v1, uint32_t v2,
85
uint32_t diff);
86
void SET_FLAGS_OSZAPC_LOGIC16(CPUX86State *env, uint16_t v1, uint16_t v2,