@samitouri / QOSamiQemu / commits / 7f7e797737

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,