xref: /qemu/tests/tcg/i386/test-mmx.c (revision fa7ce0b0)
1fa7ce0b0SPaolo Bonzini #include <stdio.h>
2fa7ce0b0SPaolo Bonzini #include <stdint.h>
3fa7ce0b0SPaolo Bonzini #include <stdlib.h>
4fa7ce0b0SPaolo Bonzini #include <string.h>
5fa7ce0b0SPaolo Bonzini 
6fa7ce0b0SPaolo Bonzini #ifndef TEST_FILE
7fa7ce0b0SPaolo Bonzini #define TEST_FILE "test-mmx.h"
8fa7ce0b0SPaolo Bonzini #endif
9fa7ce0b0SPaolo Bonzini #ifndef EMMS
10fa7ce0b0SPaolo Bonzini #define EMMS "emms"
11fa7ce0b0SPaolo Bonzini #endif
12fa7ce0b0SPaolo Bonzini 
13fa7ce0b0SPaolo Bonzini typedef void (*testfn)(void);
14fa7ce0b0SPaolo Bonzini 
15fa7ce0b0SPaolo Bonzini typedef struct {
16fa7ce0b0SPaolo Bonzini     uint64_t q0, q1;
17fa7ce0b0SPaolo Bonzini } __attribute__((aligned(16))) v2di;
18fa7ce0b0SPaolo Bonzini 
19fa7ce0b0SPaolo Bonzini typedef struct {
20fa7ce0b0SPaolo Bonzini     uint64_t mm[8];
21fa7ce0b0SPaolo Bonzini     v2di xmm[8];
22fa7ce0b0SPaolo Bonzini     uint64_t r[16];
23fa7ce0b0SPaolo Bonzini     uint64_t flags;
24fa7ce0b0SPaolo Bonzini     uint32_t ff;
25fa7ce0b0SPaolo Bonzini     uint64_t pad;
26fa7ce0b0SPaolo Bonzini     v2di mem[4];
27fa7ce0b0SPaolo Bonzini     v2di mem0[4];
28fa7ce0b0SPaolo Bonzini } reg_state;
29fa7ce0b0SPaolo Bonzini 
30fa7ce0b0SPaolo Bonzini typedef struct {
31fa7ce0b0SPaolo Bonzini     int n;
32fa7ce0b0SPaolo Bonzini     testfn fn;
33fa7ce0b0SPaolo Bonzini     const char *s;
34fa7ce0b0SPaolo Bonzini     reg_state *init;
35fa7ce0b0SPaolo Bonzini } TestDef;
36fa7ce0b0SPaolo Bonzini 
37fa7ce0b0SPaolo Bonzini reg_state initI;
38fa7ce0b0SPaolo Bonzini reg_state initF32;
39fa7ce0b0SPaolo Bonzini reg_state initF64;
40fa7ce0b0SPaolo Bonzini 
dump_mmx(int n,const uint64_t * r,int ff)41fa7ce0b0SPaolo Bonzini static void dump_mmx(int n, const uint64_t *r, int ff)
42fa7ce0b0SPaolo Bonzini {
43fa7ce0b0SPaolo Bonzini     if (ff == 32) {
44fa7ce0b0SPaolo Bonzini         float v[2];
45fa7ce0b0SPaolo Bonzini         memcpy(v, r, sizeof(v));
46fa7ce0b0SPaolo Bonzini         printf("MM%d = %016lx %8g %8g\n", n, *r, v[1], v[0]);
47fa7ce0b0SPaolo Bonzini     } else {
48fa7ce0b0SPaolo Bonzini         printf("MM%d = %016lx\n", n, *r);
49fa7ce0b0SPaolo Bonzini     }
50fa7ce0b0SPaolo Bonzini }
51fa7ce0b0SPaolo Bonzini 
dump_xmm(const char * name,int n,const v2di * r,int ff)52fa7ce0b0SPaolo Bonzini static void dump_xmm(const char *name, int n, const v2di *r, int ff)
53fa7ce0b0SPaolo Bonzini {
54fa7ce0b0SPaolo Bonzini     printf("%s%d = %016lx %016lx\n",
55fa7ce0b0SPaolo Bonzini            name, n, r->q1, r->q0);
56fa7ce0b0SPaolo Bonzini     if (ff == 32) {
57fa7ce0b0SPaolo Bonzini         float v[4];
58fa7ce0b0SPaolo Bonzini         memcpy(v, r, sizeof(v));
59fa7ce0b0SPaolo Bonzini         printf(" %8g %8g %8g %8g\n",
60fa7ce0b0SPaolo Bonzini                 v[3], v[2], v[1], v[0]);
61fa7ce0b0SPaolo Bonzini     }
62fa7ce0b0SPaolo Bonzini }
63fa7ce0b0SPaolo Bonzini 
dump_regs(reg_state * s,int ff)64fa7ce0b0SPaolo Bonzini static void dump_regs(reg_state *s, int ff)
65fa7ce0b0SPaolo Bonzini {
66fa7ce0b0SPaolo Bonzini     int i;
67fa7ce0b0SPaolo Bonzini 
68fa7ce0b0SPaolo Bonzini     for (i = 0; i < 8; i++) {
69fa7ce0b0SPaolo Bonzini         dump_mmx(i, &s->mm[i], ff);
70fa7ce0b0SPaolo Bonzini     }
71fa7ce0b0SPaolo Bonzini     for (i = 0; i < 4; i++) {
72fa7ce0b0SPaolo Bonzini         dump_xmm("mem", i, &s->mem0[i], 0);
73fa7ce0b0SPaolo Bonzini     }
74fa7ce0b0SPaolo Bonzini }
75fa7ce0b0SPaolo Bonzini 
compare_state(const reg_state * a,const reg_state * b)76fa7ce0b0SPaolo Bonzini static void compare_state(const reg_state *a, const reg_state *b)
77fa7ce0b0SPaolo Bonzini {
78fa7ce0b0SPaolo Bonzini     int i;
79fa7ce0b0SPaolo Bonzini     for (i = 0; i < 8; i++) {
80fa7ce0b0SPaolo Bonzini         if (a->mm[i] != b->mm[i]) {
81fa7ce0b0SPaolo Bonzini             printf("MM%d = %016lx\n", i, b->mm[i]);
82fa7ce0b0SPaolo Bonzini         }
83fa7ce0b0SPaolo Bonzini     }
84fa7ce0b0SPaolo Bonzini     for (i = 0; i < 16; i++) {
85fa7ce0b0SPaolo Bonzini         if (a->r[i] != b->r[i]) {
86fa7ce0b0SPaolo Bonzini             printf("r%d = %016lx\n", i, b->r[i]);
87fa7ce0b0SPaolo Bonzini         }
88fa7ce0b0SPaolo Bonzini     }
89fa7ce0b0SPaolo Bonzini     for (i = 0; i < 8; i++) {
90fa7ce0b0SPaolo Bonzini         if (memcmp(&a->xmm[i], &b->xmm[i], 8)) {
91fa7ce0b0SPaolo Bonzini             dump_xmm("xmm", i, &b->xmm[i], a->ff);
92fa7ce0b0SPaolo Bonzini         }
93fa7ce0b0SPaolo Bonzini     }
94fa7ce0b0SPaolo Bonzini     for (i = 0; i < 4; i++) {
95fa7ce0b0SPaolo Bonzini         if (memcmp(&a->mem0[i], &a->mem[i], 16)) {
96fa7ce0b0SPaolo Bonzini             dump_xmm("mem", i, &a->mem[i], a->ff);
97fa7ce0b0SPaolo Bonzini         }
98fa7ce0b0SPaolo Bonzini     }
99fa7ce0b0SPaolo Bonzini     if (a->flags != b->flags) {
100fa7ce0b0SPaolo Bonzini         printf("FLAGS = %016lx\n", b->flags);
101fa7ce0b0SPaolo Bonzini     }
102fa7ce0b0SPaolo Bonzini }
103fa7ce0b0SPaolo Bonzini 
104fa7ce0b0SPaolo Bonzini #define LOADMM(r, o) "movq " #r ", " #o "[%0]\n\t"
105fa7ce0b0SPaolo Bonzini #define LOADXMM(r, o) "movdqa " #r ", " #o "[%0]\n\t"
106fa7ce0b0SPaolo Bonzini #define STOREMM(r, o) "movq " #o "[%1], " #r "\n\t"
107fa7ce0b0SPaolo Bonzini #define STOREXMM(r, o) "movdqa " #o "[%1], " #r "\n\t"
108fa7ce0b0SPaolo Bonzini #define MMREG(F) \
109fa7ce0b0SPaolo Bonzini     F(mm0, 0x00) \
110fa7ce0b0SPaolo Bonzini     F(mm1, 0x08) \
111fa7ce0b0SPaolo Bonzini     F(mm2, 0x10) \
112fa7ce0b0SPaolo Bonzini     F(mm3, 0x18) \
113fa7ce0b0SPaolo Bonzini     F(mm4, 0x20) \
114fa7ce0b0SPaolo Bonzini     F(mm5, 0x28) \
115fa7ce0b0SPaolo Bonzini     F(mm6, 0x30) \
116fa7ce0b0SPaolo Bonzini     F(mm7, 0x38)
117fa7ce0b0SPaolo Bonzini #define XMMREG(F) \
118fa7ce0b0SPaolo Bonzini     F(xmm0, 0x040) \
119fa7ce0b0SPaolo Bonzini     F(xmm1, 0x050) \
120fa7ce0b0SPaolo Bonzini     F(xmm2, 0x060) \
121fa7ce0b0SPaolo Bonzini     F(xmm3, 0x070) \
122fa7ce0b0SPaolo Bonzini     F(xmm4, 0x080) \
123fa7ce0b0SPaolo Bonzini     F(xmm5, 0x090) \
124fa7ce0b0SPaolo Bonzini     F(xmm6, 0x0a0) \
125fa7ce0b0SPaolo Bonzini     F(xmm7, 0x0b0)
126fa7ce0b0SPaolo Bonzini #define LOADREG(r, o) "mov " #r ", " #o "[rax]\n\t"
127fa7ce0b0SPaolo Bonzini #define STOREREG(r, o) "mov " #o "[rax], " #r "\n\t"
128fa7ce0b0SPaolo Bonzini #define REG(F) \
129fa7ce0b0SPaolo Bonzini     F(rbx, 0xc8) \
130fa7ce0b0SPaolo Bonzini     F(rcx, 0xd0) \
131fa7ce0b0SPaolo Bonzini     F(rdx, 0xd8) \
132fa7ce0b0SPaolo Bonzini     F(rsi, 0xe0) \
133fa7ce0b0SPaolo Bonzini     F(rdi, 0xe8) \
134fa7ce0b0SPaolo Bonzini     F(r8, 0x100) \
135fa7ce0b0SPaolo Bonzini     F(r9, 0x108) \
136fa7ce0b0SPaolo Bonzini     F(r10, 0x110) \
137fa7ce0b0SPaolo Bonzini     F(r11, 0x118) \
138fa7ce0b0SPaolo Bonzini     F(r12, 0x120) \
139fa7ce0b0SPaolo Bonzini     F(r13, 0x128) \
140fa7ce0b0SPaolo Bonzini     F(r14, 0x130) \
141fa7ce0b0SPaolo Bonzini     F(r15, 0x138) \
142fa7ce0b0SPaolo Bonzini 
run_test(const TestDef * t)143fa7ce0b0SPaolo Bonzini static void run_test(const TestDef *t)
144fa7ce0b0SPaolo Bonzini {
145fa7ce0b0SPaolo Bonzini     reg_state result;
146fa7ce0b0SPaolo Bonzini     reg_state *init = t->init;
147fa7ce0b0SPaolo Bonzini     memcpy(init->mem, init->mem0, sizeof(init->mem));
148fa7ce0b0SPaolo Bonzini     printf("%5d %s\n", t->n, t->s);
149fa7ce0b0SPaolo Bonzini     asm volatile(
150fa7ce0b0SPaolo Bonzini             MMREG(LOADMM)
151fa7ce0b0SPaolo Bonzini             XMMREG(LOADXMM)
152fa7ce0b0SPaolo Bonzini             "sub rsp, 128\n\t"
153fa7ce0b0SPaolo Bonzini             "push rax\n\t"
154fa7ce0b0SPaolo Bonzini             "push rbx\n\t"
155fa7ce0b0SPaolo Bonzini             "push rcx\n\t"
156fa7ce0b0SPaolo Bonzini             "push rdx\n\t"
157fa7ce0b0SPaolo Bonzini             "push %1\n\t"
158fa7ce0b0SPaolo Bonzini             "push %2\n\t"
159fa7ce0b0SPaolo Bonzini             "mov rax, %0\n\t"
160fa7ce0b0SPaolo Bonzini             "pushf\n\t"
161fa7ce0b0SPaolo Bonzini             "pop rbx\n\t"
162fa7ce0b0SPaolo Bonzini             "shr rbx, 8\n\t"
163fa7ce0b0SPaolo Bonzini             "shl rbx, 8\n\t"
164fa7ce0b0SPaolo Bonzini             "mov rcx, 0x140[rax]\n\t"
165fa7ce0b0SPaolo Bonzini             "and rcx, 0xff\n\t"
166fa7ce0b0SPaolo Bonzini             "or rbx, rcx\n\t"
167fa7ce0b0SPaolo Bonzini             "push rbx\n\t"
168fa7ce0b0SPaolo Bonzini             "popf\n\t"
169fa7ce0b0SPaolo Bonzini             REG(LOADREG)
170fa7ce0b0SPaolo Bonzini             "mov rax, 0xc0[rax]\n\t"
171fa7ce0b0SPaolo Bonzini             "call [rsp]\n\t"
172fa7ce0b0SPaolo Bonzini             "mov [rsp], rax\n\t"
173fa7ce0b0SPaolo Bonzini             "mov rax, 8[rsp]\n\t"
174fa7ce0b0SPaolo Bonzini             REG(STOREREG)
175fa7ce0b0SPaolo Bonzini             "mov rbx, [rsp]\n\t"
176fa7ce0b0SPaolo Bonzini             "mov 0xc0[rax], rbx\n\t"
177fa7ce0b0SPaolo Bonzini             "mov rbx, 0\n\t"
178fa7ce0b0SPaolo Bonzini             "mov 0xf0[rax], rbx\n\t"
179fa7ce0b0SPaolo Bonzini             "mov 0xf8[rax], rbx\n\t"
180fa7ce0b0SPaolo Bonzini             "pushf\n\t"
181fa7ce0b0SPaolo Bonzini             "pop rbx\n\t"
182fa7ce0b0SPaolo Bonzini             "and rbx, 0xff\n\t"
183fa7ce0b0SPaolo Bonzini             "mov 0x140[rax], rbx\n\t"
184fa7ce0b0SPaolo Bonzini             "add rsp, 16\n\t"
185fa7ce0b0SPaolo Bonzini             "pop rdx\n\t"
186fa7ce0b0SPaolo Bonzini             "pop rcx\n\t"
187fa7ce0b0SPaolo Bonzini             "pop rbx\n\t"
188fa7ce0b0SPaolo Bonzini             "pop rax\n\t"
189fa7ce0b0SPaolo Bonzini             "add rsp, 128\n\t"
190fa7ce0b0SPaolo Bonzini             MMREG(STOREMM)
191fa7ce0b0SPaolo Bonzini 	    EMMS "\n\t"
192fa7ce0b0SPaolo Bonzini             XMMREG(STOREXMM)
193fa7ce0b0SPaolo Bonzini             : : "r"(init), "r"(&result), "r"(t->fn)
194fa7ce0b0SPaolo Bonzini             : "memory", "cc",
195fa7ce0b0SPaolo Bonzini             "rsi", "rdi",
196fa7ce0b0SPaolo Bonzini             "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
197fa7ce0b0SPaolo Bonzini             "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
198fa7ce0b0SPaolo Bonzini             "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5",
199fa7ce0b0SPaolo Bonzini             "xmm6", "xmm7", "xmm8", "xmm9", "xmm10", "xmm11",
200fa7ce0b0SPaolo Bonzini             "xmm12", "xmm13", "xmm14", "xmm15"
201fa7ce0b0SPaolo Bonzini             );
202fa7ce0b0SPaolo Bonzini     compare_state(init, &result);
203fa7ce0b0SPaolo Bonzini }
204fa7ce0b0SPaolo Bonzini 
205fa7ce0b0SPaolo Bonzini #define TEST(n, cmd, type) \
206fa7ce0b0SPaolo Bonzini static void __attribute__((naked)) test_##n(void) \
207fa7ce0b0SPaolo Bonzini { \
208fa7ce0b0SPaolo Bonzini     asm volatile(cmd); \
209fa7ce0b0SPaolo Bonzini     asm volatile("ret"); \
210fa7ce0b0SPaolo Bonzini }
211fa7ce0b0SPaolo Bonzini #include TEST_FILE
212fa7ce0b0SPaolo Bonzini 
213fa7ce0b0SPaolo Bonzini 
214fa7ce0b0SPaolo Bonzini static const TestDef test_table[] = {
215fa7ce0b0SPaolo Bonzini #define TEST(n, cmd, type) {n, test_##n, cmd, &init##type},
216fa7ce0b0SPaolo Bonzini #include TEST_FILE
217fa7ce0b0SPaolo Bonzini     {-1, NULL, "", NULL}
218fa7ce0b0SPaolo Bonzini };
219fa7ce0b0SPaolo Bonzini 
run_all(void)220fa7ce0b0SPaolo Bonzini static void run_all(void)
221fa7ce0b0SPaolo Bonzini {
222fa7ce0b0SPaolo Bonzini     const TestDef *t;
223fa7ce0b0SPaolo Bonzini     for (t = test_table; t->fn; t++) {
224fa7ce0b0SPaolo Bonzini         run_test(t);
225fa7ce0b0SPaolo Bonzini     }
226fa7ce0b0SPaolo Bonzini }
227fa7ce0b0SPaolo Bonzini 
228fa7ce0b0SPaolo Bonzini #define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0]))
229fa7ce0b0SPaolo Bonzini 
230fa7ce0b0SPaolo Bonzini float val_f32[] = {2.0, -1.0, 4.8, 0.8, 3, -42.0, 5e6, 7.5, 8.3};
231fa7ce0b0SPaolo Bonzini uint64_t val_i64[] = {
232fa7ce0b0SPaolo Bonzini     0x3d6b3b6a9e4118f2lu, 0x355ae76d2774d78clu,
233fa7ce0b0SPaolo Bonzini     0xd851c54a56bf1f29lu, 0x4a84d1d50bf4c4fflu,
234fa7ce0b0SPaolo Bonzini     0x5826475e2c5fd799lu, 0xfd32edc01243f5e9lu,
235fa7ce0b0SPaolo Bonzini };
236fa7ce0b0SPaolo Bonzini 
237fa7ce0b0SPaolo Bonzini v2di deadbeef = {0xa5a5a5a5deadbeefull, 0xa5a5a5a5deadbeefull};
238fa7ce0b0SPaolo Bonzini 
init_f32reg(uint64_t * r)239fa7ce0b0SPaolo Bonzini void init_f32reg(uint64_t *r)
240fa7ce0b0SPaolo Bonzini {
241fa7ce0b0SPaolo Bonzini     static int n;
242fa7ce0b0SPaolo Bonzini     float v[2];
243fa7ce0b0SPaolo Bonzini     int i;
244fa7ce0b0SPaolo Bonzini     for (i = 0; i < 2; i++) {
245fa7ce0b0SPaolo Bonzini         v[i] = val_f32[n++];
246fa7ce0b0SPaolo Bonzini         if (n == ARRAY_LEN(val_f32)) {
247fa7ce0b0SPaolo Bonzini             n = 0;
248fa7ce0b0SPaolo Bonzini         }
249fa7ce0b0SPaolo Bonzini     }
250fa7ce0b0SPaolo Bonzini     memcpy(r, v, sizeof(*r));
251fa7ce0b0SPaolo Bonzini }
252fa7ce0b0SPaolo Bonzini 
init_intreg(uint64_t * r)253fa7ce0b0SPaolo Bonzini void init_intreg(uint64_t *r)
254fa7ce0b0SPaolo Bonzini {
255fa7ce0b0SPaolo Bonzini     static uint64_t mask;
256fa7ce0b0SPaolo Bonzini     static int n;
257fa7ce0b0SPaolo Bonzini 
258fa7ce0b0SPaolo Bonzini     *r = val_i64[n] ^ mask;
259fa7ce0b0SPaolo Bonzini     n++;
260fa7ce0b0SPaolo Bonzini     if (n == ARRAY_LEN(val_i64)) {
261fa7ce0b0SPaolo Bonzini         n = 0;
262fa7ce0b0SPaolo Bonzini         mask *= 0x104C11DB7;
263fa7ce0b0SPaolo Bonzini     }
264fa7ce0b0SPaolo Bonzini }
265fa7ce0b0SPaolo Bonzini 
init_all(reg_state * s)266fa7ce0b0SPaolo Bonzini static void init_all(reg_state *s)
267fa7ce0b0SPaolo Bonzini {
268fa7ce0b0SPaolo Bonzini     int i;
269fa7ce0b0SPaolo Bonzini 
270fa7ce0b0SPaolo Bonzini     for (i = 0; i < 16; i++) {
271fa7ce0b0SPaolo Bonzini         init_intreg(&s->r[i]);
272fa7ce0b0SPaolo Bonzini     }
273fa7ce0b0SPaolo Bonzini     s->r[3] = (uint64_t)&s->mem[0]; /* rdx */
274fa7ce0b0SPaolo Bonzini     s->r[5] = (uint64_t)&s->mem[2]; /* rdi */
275fa7ce0b0SPaolo Bonzini     s->r[6] = 0;
276fa7ce0b0SPaolo Bonzini     s->r[7] = 0;
277fa7ce0b0SPaolo Bonzini     s->flags = 2;
278fa7ce0b0SPaolo Bonzini     for (i = 0; i < 8; i++) {
279fa7ce0b0SPaolo Bonzini         s->xmm[i] = deadbeef;
280fa7ce0b0SPaolo Bonzini 	memcpy(&s->mm[i], &s->xmm[i], sizeof(s->mm[i]));
281fa7ce0b0SPaolo Bonzini     }
282fa7ce0b0SPaolo Bonzini     for (i = 0; i < 2; i++) {
283fa7ce0b0SPaolo Bonzini         s->mem0[i] = deadbeef;
284fa7ce0b0SPaolo Bonzini     }
285fa7ce0b0SPaolo Bonzini }
286fa7ce0b0SPaolo Bonzini 
main(int argc,char * argv[])287fa7ce0b0SPaolo Bonzini int main(int argc, char *argv[])
288fa7ce0b0SPaolo Bonzini {
289fa7ce0b0SPaolo Bonzini     init_all(&initI);
290fa7ce0b0SPaolo Bonzini     init_intreg(&initI.mm[5]);
291fa7ce0b0SPaolo Bonzini     init_intreg(&initI.mm[6]);
292fa7ce0b0SPaolo Bonzini     init_intreg(&initI.mm[7]);
293fa7ce0b0SPaolo Bonzini     init_intreg(&initI.mem0[1].q0);
294fa7ce0b0SPaolo Bonzini     init_intreg(&initI.mem0[1].q1);
295fa7ce0b0SPaolo Bonzini     printf("Int:\n");
296fa7ce0b0SPaolo Bonzini     dump_regs(&initI, 0);
297fa7ce0b0SPaolo Bonzini 
298fa7ce0b0SPaolo Bonzini     init_all(&initF32);
299fa7ce0b0SPaolo Bonzini     init_f32reg(&initF32.mm[5]);
300fa7ce0b0SPaolo Bonzini     init_f32reg(&initF32.mm[6]);
301fa7ce0b0SPaolo Bonzini     init_f32reg(&initF32.mm[7]);
302fa7ce0b0SPaolo Bonzini     init_f32reg(&initF32.mem0[1].q0);
303fa7ce0b0SPaolo Bonzini     init_f32reg(&initF32.mem0[1].q1);
304fa7ce0b0SPaolo Bonzini     initF32.ff = 32;
305fa7ce0b0SPaolo Bonzini     printf("F32:\n");
306fa7ce0b0SPaolo Bonzini     dump_regs(&initF32, 32);
307fa7ce0b0SPaolo Bonzini 
308fa7ce0b0SPaolo Bonzini     if (argc > 1) {
309fa7ce0b0SPaolo Bonzini         int n = atoi(argv[1]);
310fa7ce0b0SPaolo Bonzini         run_test(&test_table[n]);
311fa7ce0b0SPaolo Bonzini     } else {
312fa7ce0b0SPaolo Bonzini         run_all();
313fa7ce0b0SPaolo Bonzini     }
314fa7ce0b0SPaolo Bonzini     return 0;
315fa7ce0b0SPaolo Bonzini }
316