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);
322*05a0a100SPaolo Bonzini init_intreg(&initI.ymm[0]);
323*05a0a100SPaolo 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);
332*05a0a100SPaolo Bonzini init_f16reg(&initF16.ymm[0]);
333*05a0a100SPaolo 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);
343*05a0a100SPaolo Bonzini init_f32reg(&initF32.ymm[0]);
344*05a0a100SPaolo 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);
354*05a0a100SPaolo Bonzini init_f64reg(&initF64.ymm[0]);
355*05a0a100SPaolo 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