xref: /qemu/tests/tcg/i386/test-avx.c (revision 05a0a100)
191117bc5SPaul Brook #include <stdio.h>
291117bc5SPaul Brook #include <stdint.h>
391117bc5SPaul Brook #include <stdlib.h>
491117bc5SPaul Brook #include <string.h>
591117bc5SPaul Brook 
691117bc5SPaul Brook typedef void (*testfn)(void);
791117bc5SPaul Brook 
891117bc5SPaul Brook typedef struct {
90339ddfaSPaolo Bonzini     uint64_t q0, q1, q2, q3;
100339ddfaSPaolo Bonzini } __attribute__((aligned(32))) v4di;
1191117bc5SPaul Brook 
1291117bc5SPaul Brook typedef struct {
1391117bc5SPaul Brook     uint64_t mm[8];
140339ddfaSPaolo Bonzini     v4di ymm[16];
1591117bc5SPaul Brook     uint64_t r[16];
1691117bc5SPaul Brook     uint64_t flags;
1791117bc5SPaul Brook     uint32_t ff;
1891117bc5SPaul Brook     uint64_t pad;
190339ddfaSPaolo Bonzini     v4di mem[4];
200339ddfaSPaolo Bonzini     v4di mem0[4];
2191117bc5SPaul Brook } reg_state;
2291117bc5SPaul Brook 
2391117bc5SPaul Brook typedef struct {
2491117bc5SPaul Brook     int n;
2591117bc5SPaul Brook     testfn fn;
2691117bc5SPaul Brook     const char *s;
2791117bc5SPaul Brook     reg_state *init;
2891117bc5SPaul Brook } TestDef;
2991117bc5SPaul Brook 
3091117bc5SPaul Brook reg_state initI;
31cf5ec664SPaolo Bonzini reg_state initF16;
3291117bc5SPaul Brook reg_state initF32;
3391117bc5SPaul Brook reg_state initF64;
3491117bc5SPaul Brook 
dump_ymm(const char * name,int n,const v4di * r,int ff)350339ddfaSPaolo Bonzini static void dump_ymm(const char *name, int n, const v4di *r, int ff)
3691117bc5SPaul Brook {
370339ddfaSPaolo Bonzini     printf("%s%d = %016lx %016lx %016lx %016lx\n",
380339ddfaSPaolo Bonzini            name, n, r->q3, r->q2, r->q1, r->q0);
3991117bc5SPaul Brook     if (ff == 64) {
400339ddfaSPaolo Bonzini         double v[4];
4191117bc5SPaul Brook         memcpy(v, r, sizeof(v));
420339ddfaSPaolo Bonzini         printf("        %16g %16g %16g %16g\n",
4391117bc5SPaul Brook                 v[3], v[2], v[1], v[0]);
440339ddfaSPaolo Bonzini     } else if (ff == 32) {
450339ddfaSPaolo Bonzini         float v[8];
460339ddfaSPaolo Bonzini         memcpy(v, r, sizeof(v));
470339ddfaSPaolo Bonzini         printf(" %8g %8g %8g %8g %8g %8g %8g %8g\n",
480339ddfaSPaolo Bonzini                 v[7], v[6], v[5], v[4], v[3], v[2], v[1], v[0]);
4991117bc5SPaul Brook     }
5091117bc5SPaul Brook }
5191117bc5SPaul Brook 
dump_regs(reg_state * s)5291117bc5SPaul Brook static void dump_regs(reg_state *s)
5391117bc5SPaul Brook {
5491117bc5SPaul Brook     int i;
5591117bc5SPaul Brook 
5691117bc5SPaul Brook     for (i = 0; i < 16; i++) {
570339ddfaSPaolo Bonzini         dump_ymm("ymm", i, &s->ymm[i], 0);
5891117bc5SPaul Brook     }
5991117bc5SPaul Brook     for (i = 0; i < 4; i++) {
600339ddfaSPaolo Bonzini         dump_ymm("mem", i, &s->mem0[i], 0);
6191117bc5SPaul Brook     }
6291117bc5SPaul Brook }
6391117bc5SPaul Brook 
compare_state(const reg_state * a,const reg_state * b)6491117bc5SPaul Brook static void compare_state(const reg_state *a, const reg_state *b)
6591117bc5SPaul Brook {
6691117bc5SPaul Brook     int i;
6791117bc5SPaul Brook     for (i = 0; i < 8; i++) {
6891117bc5SPaul Brook         if (a->mm[i] != b->mm[i]) {
6991117bc5SPaul Brook             printf("MM%d = %016lx\n", i, b->mm[i]);
7091117bc5SPaul Brook         }
7191117bc5SPaul Brook     }
7291117bc5SPaul Brook     for (i = 0; i < 16; i++) {
7391117bc5SPaul Brook         if (a->r[i] != b->r[i]) {
7491117bc5SPaul Brook             printf("r%d = %016lx\n", i, b->r[i]);
7591117bc5SPaul Brook         }
7691117bc5SPaul Brook     }
7791117bc5SPaul Brook     for (i = 0; i < 16; i++) {
780339ddfaSPaolo Bonzini         if (memcmp(&a->ymm[i], &b->ymm[i], 32)) {
790339ddfaSPaolo Bonzini             dump_ymm("ymm", i, &b->ymm[i], a->ff);
8091117bc5SPaul Brook         }
8191117bc5SPaul Brook     }
8291117bc5SPaul Brook     for (i = 0; i < 4; i++) {
830339ddfaSPaolo Bonzini         if (memcmp(&a->mem0[i], &a->mem[i], 32)) {
840339ddfaSPaolo Bonzini             dump_ymm("mem", i, &a->mem[i], a->ff);
8591117bc5SPaul Brook         }
8691117bc5SPaul Brook     }
8791117bc5SPaul Brook     if (a->flags != b->flags) {
8891117bc5SPaul Brook         printf("FLAGS = %016lx\n", b->flags);
8991117bc5SPaul Brook     }
9091117bc5SPaul Brook }
9191117bc5SPaul Brook 
9291117bc5SPaul Brook #define LOADMM(r, o) "movq " #r ", " #o "[%0]\n\t"
930339ddfaSPaolo Bonzini #define LOADYMM(r, o) "vmovdqa " #r ", " #o "[%0]\n\t"
9491117bc5SPaul Brook #define STOREMM(r, o) "movq " #o "[%1], " #r "\n\t"
950339ddfaSPaolo Bonzini #define STOREYMM(r, o) "vmovdqa " #o "[%1], " #r "\n\t"
9691117bc5SPaul Brook #define MMREG(F) \
9791117bc5SPaul Brook     F(mm0, 0x00) \
9891117bc5SPaul Brook     F(mm1, 0x08) \
9991117bc5SPaul Brook     F(mm2, 0x10) \
10091117bc5SPaul Brook     F(mm3, 0x18) \
10191117bc5SPaul Brook     F(mm4, 0x20) \
10291117bc5SPaul Brook     F(mm5, 0x28) \
10391117bc5SPaul Brook     F(mm6, 0x30) \
10491117bc5SPaul Brook     F(mm7, 0x38)
1050339ddfaSPaolo Bonzini #define YMMREG(F) \
1060339ddfaSPaolo Bonzini     F(ymm0, 0x040) \
1070339ddfaSPaolo Bonzini     F(ymm1, 0x060) \
1080339ddfaSPaolo Bonzini     F(ymm2, 0x080) \
1090339ddfaSPaolo Bonzini     F(ymm3, 0x0a0) \
1100339ddfaSPaolo Bonzini     F(ymm4, 0x0c0) \
1110339ddfaSPaolo Bonzini     F(ymm5, 0x0e0) \
1120339ddfaSPaolo Bonzini     F(ymm6, 0x100) \
1130339ddfaSPaolo Bonzini     F(ymm7, 0x120) \
1140339ddfaSPaolo Bonzini     F(ymm8, 0x140) \
1150339ddfaSPaolo Bonzini     F(ymm9, 0x160) \
1160339ddfaSPaolo Bonzini     F(ymm10, 0x180) \
1170339ddfaSPaolo Bonzini     F(ymm11, 0x1a0) \
1180339ddfaSPaolo Bonzini     F(ymm12, 0x1c0) \
1190339ddfaSPaolo Bonzini     F(ymm13, 0x1e0) \
1200339ddfaSPaolo Bonzini     F(ymm14, 0x200) \
1210339ddfaSPaolo Bonzini     F(ymm15, 0x220)
12291117bc5SPaul Brook #define LOADREG(r, o) "mov " #r ", " #o "[rax]\n\t"
12391117bc5SPaul Brook #define STOREREG(r, o) "mov " #o "[rax], " #r "\n\t"
12491117bc5SPaul Brook #define REG(F) \
1250339ddfaSPaolo Bonzini     F(rbx, 0x248) \
1260339ddfaSPaolo Bonzini     F(rcx, 0x250) \
1270339ddfaSPaolo Bonzini     F(rdx, 0x258) \
1280339ddfaSPaolo Bonzini     F(rsi, 0x260) \
1290339ddfaSPaolo Bonzini     F(rdi, 0x268) \
1300339ddfaSPaolo Bonzini     F(r8, 0x280) \
1310339ddfaSPaolo Bonzini     F(r9, 0x288) \
1320339ddfaSPaolo Bonzini     F(r10, 0x290) \
1330339ddfaSPaolo Bonzini     F(r11, 0x298) \
1340339ddfaSPaolo Bonzini     F(r12, 0x2a0) \
1350339ddfaSPaolo Bonzini     F(r13, 0x2a8) \
1360339ddfaSPaolo Bonzini     F(r14, 0x2b0) \
1370339ddfaSPaolo Bonzini     F(r15, 0x2b8) \
13891117bc5SPaul Brook 
run_test(const TestDef * t)13991117bc5SPaul Brook static void run_test(const TestDef *t)
14091117bc5SPaul Brook {
14191117bc5SPaul Brook     reg_state result;
14291117bc5SPaul Brook     reg_state *init = t->init;
14391117bc5SPaul Brook     memcpy(init->mem, init->mem0, sizeof(init->mem));
14491117bc5SPaul Brook     printf("%5d %s\n", t->n, t->s);
14591117bc5SPaul Brook     asm volatile(
14691117bc5SPaul Brook             MMREG(LOADMM)
1470339ddfaSPaolo Bonzini             YMMREG(LOADYMM)
14891117bc5SPaul Brook             "sub rsp, 128\n\t"
14991117bc5SPaul Brook             "push rax\n\t"
15091117bc5SPaul Brook             "push rbx\n\t"
15191117bc5SPaul Brook             "push rcx\n\t"
15291117bc5SPaul Brook             "push rdx\n\t"
15391117bc5SPaul Brook             "push %1\n\t"
15491117bc5SPaul Brook             "push %2\n\t"
15591117bc5SPaul Brook             "mov rax, %0\n\t"
15691117bc5SPaul Brook             "pushf\n\t"
15791117bc5SPaul Brook             "pop rbx\n\t"
15891117bc5SPaul Brook             "shr rbx, 8\n\t"
15991117bc5SPaul Brook             "shl rbx, 8\n\t"
1600339ddfaSPaolo Bonzini             "mov rcx, 0x2c0[rax]\n\t"
16191117bc5SPaul Brook             "and rcx, 0xff\n\t"
16291117bc5SPaul Brook             "or rbx, rcx\n\t"
16391117bc5SPaul Brook             "push rbx\n\t"
16491117bc5SPaul Brook             "popf\n\t"
16591117bc5SPaul Brook             REG(LOADREG)
1660339ddfaSPaolo Bonzini             "mov rax, 0x240[rax]\n\t"
16791117bc5SPaul Brook             "call [rsp]\n\t"
16891117bc5SPaul Brook             "mov [rsp], rax\n\t"
16991117bc5SPaul Brook             "mov rax, 8[rsp]\n\t"
17091117bc5SPaul Brook             REG(STOREREG)
17191117bc5SPaul Brook             "mov rbx, [rsp]\n\t"
1720339ddfaSPaolo Bonzini             "mov 0x240[rax], rbx\n\t"
17391117bc5SPaul Brook             "mov rbx, 0\n\t"
1740339ddfaSPaolo Bonzini             "mov 0x270[rax], rbx\n\t"
1750339ddfaSPaolo Bonzini             "mov 0x278[rax], rbx\n\t"
17691117bc5SPaul Brook             "pushf\n\t"
17791117bc5SPaul Brook             "pop rbx\n\t"
17891117bc5SPaul Brook             "and rbx, 0xff\n\t"
1790339ddfaSPaolo Bonzini             "mov 0x2c0[rax], rbx\n\t"
18091117bc5SPaul Brook             "add rsp, 16\n\t"
18191117bc5SPaul Brook             "pop rdx\n\t"
18291117bc5SPaul Brook             "pop rcx\n\t"
18391117bc5SPaul Brook             "pop rbx\n\t"
18491117bc5SPaul Brook             "pop rax\n\t"
18591117bc5SPaul Brook             "add rsp, 128\n\t"
18691117bc5SPaul Brook             MMREG(STOREMM)
1870339ddfaSPaolo Bonzini             YMMREG(STOREYMM)
18891117bc5SPaul Brook             : : "r"(init), "r"(&result), "r"(t->fn)
18991117bc5SPaul Brook             : "memory", "cc",
19091117bc5SPaul Brook             "rsi", "rdi",
19191117bc5SPaul Brook             "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
19291117bc5SPaul Brook             "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1930339ddfaSPaolo Bonzini             "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5",
1940339ddfaSPaolo Bonzini             "ymm6", "ymm7", "ymm8", "ymm9", "ymm10", "ymm11",
1950339ddfaSPaolo Bonzini             "ymm12", "ymm13", "ymm14", "ymm15"
19691117bc5SPaul Brook             );
19791117bc5SPaul Brook     compare_state(init, &result);
19891117bc5SPaul Brook }
19991117bc5SPaul Brook 
20091117bc5SPaul Brook #define TEST(n, cmd, type) \
20191117bc5SPaul Brook static void __attribute__((naked)) test_##n(void) \
20291117bc5SPaul Brook { \
20391117bc5SPaul Brook     asm volatile(cmd); \
20491117bc5SPaul Brook     asm volatile("ret"); \
20591117bc5SPaul Brook }
20691117bc5SPaul Brook #include "test-avx.h"
20791117bc5SPaul Brook 
20891117bc5SPaul Brook 
20991117bc5SPaul Brook static const TestDef test_table[] = {
21091117bc5SPaul Brook #define TEST(n, cmd, type) {n, test_##n, cmd, &init##type},
21191117bc5SPaul Brook #include "test-avx.h"
21291117bc5SPaul Brook     {-1, NULL, "", NULL}
21391117bc5SPaul Brook };
21491117bc5SPaul Brook 
run_all(void)21591117bc5SPaul Brook static void run_all(void)
21691117bc5SPaul Brook {
21791117bc5SPaul Brook     const TestDef *t;
21891117bc5SPaul Brook     for (t = test_table; t->fn; t++) {
21991117bc5SPaul Brook         run_test(t);
22091117bc5SPaul Brook     }
22191117bc5SPaul Brook }
22291117bc5SPaul Brook 
22391117bc5SPaul Brook #define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0]))
22491117bc5SPaul Brook 
225cf5ec664SPaolo Bonzini uint16_t val_f16[] = { 0x4000, 0xbc00, 0x44cd, 0x3a66, 0x4200, 0x7a1a, 0x4780, 0x4826 };
22691117bc5SPaul Brook float val_f32[] = {2.0, -1.0, 4.8, 0.8, 3, -42.0, 5e6, 7.5, 8.3};
22791117bc5SPaul Brook double val_f64[] = {2.0, -1.0, 4.8, 0.8, 3, -42.0, 5e6, 7.5};
2280339ddfaSPaolo Bonzini v4di val_i64[] = {
2290339ddfaSPaolo Bonzini     {0x3d6b3b6a9e4118f2lu, 0x355ae76d2774d78clu,
2300339ddfaSPaolo Bonzini      0xac3ff76c4daa4b28lu, 0xe7fabd204cb54083lu},
2310339ddfaSPaolo Bonzini     {0xd851c54a56bf1f29lu, 0x4a84d1d50bf4c4fflu,
2320339ddfaSPaolo Bonzini      0x56621e553d52b56clu, 0xd0069553da8f584alu},
2330339ddfaSPaolo Bonzini     {0x5826475e2c5fd799lu, 0xfd32edc01243f5e9lu,
2340339ddfaSPaolo Bonzini      0x738ba2c66d3fe126lu, 0x5707219c6e6c26b4lu},
23591117bc5SPaul Brook };
23691117bc5SPaul Brook 
2370339ddfaSPaolo Bonzini v4di deadbeef = {0xa5a5a5a5deadbeefull, 0xa5a5a5a5deadbeefull,
2380339ddfaSPaolo Bonzini                  0xa5a5a5a5deadbeefull, 0xa5a5a5a5deadbeefull};
23945b5933fSPaolo Bonzini /* &gather_mem[0x10] is 512 bytes from the base; indices must be >=-64, <64
24045b5933fSPaolo Bonzini  * to account for scaling by 8 */
24145b5933fSPaolo Bonzini v4di indexq = {0x000000000000001full, 0x000000000000003dull,
24245b5933fSPaolo Bonzini                0xffffffffffffffffull, 0xffffffffffffffdfull};
24345b5933fSPaolo Bonzini v4di indexd = {0x00000002ffffffcdull, 0xfffffff500000010ull,
24445b5933fSPaolo Bonzini                0x0000003afffffff0ull, 0x000000000000000eull};
24591117bc5SPaul Brook 
2460339ddfaSPaolo Bonzini v4di gather_mem[0x20];
24745b5933fSPaolo Bonzini _Static_assert(sizeof(gather_mem) == 1024);
2480339ddfaSPaolo Bonzini 
init_f16reg(v4di * r)249cf5ec664SPaolo Bonzini void init_f16reg(v4di *r)
250cf5ec664SPaolo Bonzini {
251cf5ec664SPaolo Bonzini     memset(r, 0, sizeof(*r));
252cf5ec664SPaolo Bonzini     memcpy(r, val_f16, sizeof(val_f16));
253cf5ec664SPaolo Bonzini }
254cf5ec664SPaolo Bonzini 
init_f32reg(v4di * r)2550339ddfaSPaolo Bonzini void init_f32reg(v4di *r)
25691117bc5SPaul Brook {
25791117bc5SPaul Brook     static int n;
2580339ddfaSPaolo Bonzini     float v[8];
25991117bc5SPaul Brook     int i;
2600339ddfaSPaolo Bonzini     for (i = 0; i < 8; i++) {
26191117bc5SPaul Brook         v[i] = val_f32[n++];
26291117bc5SPaul Brook         if (n == ARRAY_LEN(val_f32)) {
26391117bc5SPaul Brook             n = 0;
26491117bc5SPaul Brook         }
26591117bc5SPaul Brook     }
26691117bc5SPaul Brook     memcpy(r, v, sizeof(*r));
26791117bc5SPaul Brook }
26891117bc5SPaul Brook 
init_f64reg(v4di * r)2690339ddfaSPaolo Bonzini void init_f64reg(v4di *r)
27091117bc5SPaul Brook {
27191117bc5SPaul Brook     static int n;
2720339ddfaSPaolo Bonzini     double v[4];
27391117bc5SPaul Brook     int i;
2740339ddfaSPaolo Bonzini     for (i = 0; i < 4; i++) {
27591117bc5SPaul Brook         v[i] = val_f64[n++];
27691117bc5SPaul Brook         if (n == ARRAY_LEN(val_f64)) {
27791117bc5SPaul Brook             n = 0;
27891117bc5SPaul Brook         }
27991117bc5SPaul Brook     }
28091117bc5SPaul Brook     memcpy(r, v, sizeof(*r));
28191117bc5SPaul Brook }
28291117bc5SPaul Brook 
init_intreg(v4di * r)2830339ddfaSPaolo Bonzini void init_intreg(v4di *r)
28491117bc5SPaul Brook {
28591117bc5SPaul Brook     static uint64_t mask;
28691117bc5SPaul Brook     static int n;
28791117bc5SPaul Brook 
28891117bc5SPaul Brook     r->q0 = val_i64[n].q0 ^ mask;
28991117bc5SPaul Brook     r->q1 = val_i64[n].q1 ^ mask;
2900339ddfaSPaolo Bonzini     r->q2 = val_i64[n].q2 ^ mask;
2910339ddfaSPaolo Bonzini     r->q3 = val_i64[n].q3 ^ mask;
29291117bc5SPaul Brook     n++;
29391117bc5SPaul Brook     if (n == ARRAY_LEN(val_i64)) {
29491117bc5SPaul Brook         n = 0;
29591117bc5SPaul Brook         mask *= 0x104C11DB7;
29691117bc5SPaul Brook     }
29791117bc5SPaul Brook }
29891117bc5SPaul Brook 
init_all(reg_state * s)29991117bc5SPaul Brook static void init_all(reg_state *s)
30091117bc5SPaul Brook {
30191117bc5SPaul Brook     int i;
30291117bc5SPaul Brook 
30391117bc5SPaul Brook     s->r[3] = (uint64_t)&s->mem[0]; /* rdx */
3040339ddfaSPaolo Bonzini     s->r[4] = (uint64_t)&gather_mem[ARRAY_LEN(gather_mem) / 2]; /* rsi */
30591117bc5SPaul Brook     s->r[5] = (uint64_t)&s->mem[2]; /* rdi */
30691117bc5SPaul Brook     s->flags = 2;
3070339ddfaSPaolo Bonzini     for (i = 0; i < 16; i++) {
3080339ddfaSPaolo Bonzini         s->ymm[i] = deadbeef;
30991117bc5SPaul Brook     }
3100339ddfaSPaolo Bonzini     s->ymm[13] = indexd;
3110339ddfaSPaolo Bonzini     s->ymm[14] = indexq;
3120339ddfaSPaolo Bonzini     for (i = 0; i < 4; i++) {
31391117bc5SPaul Brook         s->mem0[i] = deadbeef;
31491117bc5SPaul Brook     }
31591117bc5SPaul Brook }
31691117bc5SPaul Brook 
main(int argc,char * argv[])31791117bc5SPaul Brook int main(int argc, char *argv[])
31891117bc5SPaul Brook {
3190339ddfaSPaolo Bonzini     int i;
3200339ddfaSPaolo Bonzini 
32191117bc5SPaul Brook     init_all(&initI);
32205a0a100SPaolo Bonzini     init_intreg(&initI.ymm[0]);
32305a0a100SPaolo Bonzini     init_intreg(&initI.ymm[9]);
3240339ddfaSPaolo Bonzini     init_intreg(&initI.ymm[10]);
3250339ddfaSPaolo Bonzini     init_intreg(&initI.ymm[11]);
3260339ddfaSPaolo Bonzini     init_intreg(&initI.ymm[12]);
32791117bc5SPaul Brook     init_intreg(&initI.mem0[1]);
32891117bc5SPaul Brook     printf("Int:\n");
32991117bc5SPaul Brook     dump_regs(&initI);
33091117bc5SPaul Brook 
331cf5ec664SPaolo Bonzini     init_all(&initF16);
33205a0a100SPaolo Bonzini     init_f16reg(&initF16.ymm[0]);
33305a0a100SPaolo Bonzini     init_f16reg(&initF16.ymm[9]);
334cf5ec664SPaolo Bonzini     init_f16reg(&initF16.ymm[10]);
335cf5ec664SPaolo Bonzini     init_f16reg(&initF16.ymm[11]);
336cf5ec664SPaolo Bonzini     init_f16reg(&initF16.ymm[12]);
337cf5ec664SPaolo Bonzini     init_f16reg(&initF16.mem0[1]);
338cf5ec664SPaolo Bonzini     initF16.ff = 16;
339cf5ec664SPaolo Bonzini     printf("F16:\n");
340cf5ec664SPaolo Bonzini     dump_regs(&initF16);
341cf5ec664SPaolo Bonzini 
34291117bc5SPaul Brook     init_all(&initF32);
34305a0a100SPaolo Bonzini     init_f32reg(&initF32.ymm[0]);
34405a0a100SPaolo Bonzini     init_f32reg(&initF32.ymm[9]);
3450339ddfaSPaolo Bonzini     init_f32reg(&initF32.ymm[10]);
3460339ddfaSPaolo Bonzini     init_f32reg(&initF32.ymm[11]);
3470339ddfaSPaolo Bonzini     init_f32reg(&initF32.ymm[12]);
34891117bc5SPaul Brook     init_f32reg(&initF32.mem0[1]);
34991117bc5SPaul Brook     initF32.ff = 32;
35091117bc5SPaul Brook     printf("F32:\n");
35191117bc5SPaul Brook     dump_regs(&initF32);
35291117bc5SPaul Brook 
35391117bc5SPaul Brook     init_all(&initF64);
35405a0a100SPaolo Bonzini     init_f64reg(&initF64.ymm[0]);
35505a0a100SPaolo Bonzini     init_f64reg(&initF64.ymm[9]);
3560339ddfaSPaolo Bonzini     init_f64reg(&initF64.ymm[10]);
3570339ddfaSPaolo Bonzini     init_f64reg(&initF64.ymm[11]);
3580339ddfaSPaolo Bonzini     init_f64reg(&initF64.ymm[12]);
35991117bc5SPaul Brook     init_f64reg(&initF64.mem0[1]);
36091117bc5SPaul Brook     initF64.ff = 64;
36191117bc5SPaul Brook     printf("F64:\n");
36291117bc5SPaul Brook     dump_regs(&initF64);
36391117bc5SPaul Brook 
3640339ddfaSPaolo Bonzini     for (i = 0; i < ARRAY_LEN(gather_mem); i++) {
3650339ddfaSPaolo Bonzini         init_intreg(&gather_mem[i]);
3660339ddfaSPaolo Bonzini     }
3670339ddfaSPaolo Bonzini 
36891117bc5SPaul Brook     if (argc > 1) {
36991117bc5SPaul Brook         int n = atoi(argv[1]);
37091117bc5SPaul Brook         run_test(&test_table[n]);
37191117bc5SPaul Brook     } else {
37291117bc5SPaul Brook         run_all();
37391117bc5SPaul Brook     }
37491117bc5SPaul Brook     return 0;
37591117bc5SPaul Brook }
376