1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "tests/asm.h"
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "tests/malloc.h"
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <string.h>
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst unsigned int vec0[4]
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   = { 0x12345678, 0x11223344, 0x55667788, 0x87654321 };
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst unsigned int vec1[4]
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   = { 0xABCDEF01, 0xAABBCCDD, 0xEEFF0011, 0x10FEDCBA };
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovconst unsigned int vecZ[4]
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   = { 0, 0, 0, 0 };
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov__attribute__((noinline))
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid do_fxsave ( void* p, int rexw ) {
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (rexw) {
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      asm __volatile__("rex64/fxsave (%0)" : : "r" (p) : "memory" );
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      asm __volatile__("fxsave (%0)" : : "r" (p) : "memory" );
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov__attribute__((noinline))
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid do_fxrstor ( void* p, int rexw ) {
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (rexw) {
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      asm __volatile__("rex64/fxrstor (%0)" : : "r" (p) : "memory" );
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      asm __volatile__("fxrstor (%0)" : : "r" (p) : "memory" );
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid do_zeroise ( void )
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("finit");
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__(
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "fldz\n\t"
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "fldz\n\t"
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "fldz\n\t"
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "fldz\n\t"
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "fldz\n\t"
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "fldz\n\t"
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "fldz\n\t"
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "fldz\n\t"
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "finit\n");
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm0");
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm1");
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm2");
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm3");
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm4");
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm5");
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm6");
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm7");
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm8");
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm9");
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm10");
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm11");
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm12");
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm13");
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm14");
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) ", %xmm15");
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm0");
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm1");
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm2");
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm3");
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm4");
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm5");
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm6");
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm7");
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm8");
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm9");
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm10");
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm11");
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm12");
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm13");
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm14");
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__("movups " VG_SYM(vecZ) "(%rip), %xmm15");
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm __volatile__(
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      "pushq $0\n\t"
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      "ldmxcsr 0(%rsp)\n\t"
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      "addq $8,%rsp\n");
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* set up the FP and SSE state, and then dump it. */
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid do_setup_then_fxsave ( void* p, int rexw )
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("finit");
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("fldpi");
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("fld1");
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("fldln2");
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("fldlg2");
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("fld %st(3)");
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("fld %st(3)");
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("fld1");
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movups (%0), %%xmm0" : : "r"(&vec0[0]) : "xmm0" );
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movups (%0), %%xmm1" : : "r"(&vec1[0]) : "xmm1" );
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("xorps  %xmm2, %xmm2");
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm0, %xmm3");
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm1, %xmm4");
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm2, %xmm5");
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm0, %xmm6");
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm1, %xmm7");
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm1, %xmm8");
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm2, %xmm9");
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm0, %xmm10");
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm1, %xmm11");
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm1, %xmm12");
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm2, %xmm13");
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm0, %xmm14");
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm __volatile__("movaps %xmm1, %xmm15");
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_fxsave(p, rexw);
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint isFPLsbs ( int i )
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int q;
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   q = 32; if (i == q || i == q+1) return 1;
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   q = 48; if (i == q || i == q+1) return 1;
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   q = 64; if (i == q || i == q+1) return 1;
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   q = 80; if (i == q || i == q+1) return 1;
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   q = 96; if (i == q || i == q+1) return 1;
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   q = 112; if (i == q || i == q+1) return 1;
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   q = 128; if (i == q || i == q+1) return 1;
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   q = 144; if (i == q || i == q+1) return 1;
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid show ( unsigned char* buf, int xx )
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int i;
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for (i = 0; i < 512; i++) {
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if ((i % 16) == 0)
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         printf("%3d   ", i);
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (xx && isFPLsbs(i))
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 printf("xx ");
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         printf("%02x ", buf[i]);
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (i > 0 && ((i % 16) == 15))
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          printf("\n");
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main ( int argc, char** argv )
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   unsigned char* buf1 = memalign16(512);
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   unsigned char* buf2 = memalign16(512);
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   unsigned char* buf3 = memalign16(512);
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int xx = argc > 1;
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("Re-run with any arg to suppress least-significant\n"
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          "   16 bits of FP numbers\n");
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("\n-------- FXSAVE non-64 (REX.W == 0) --------\n");
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   memset(buf1, 0x55, 512);
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   memset(buf2, 0x55, 512);
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   memset(buf3, 0x55, 512);
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Load up x87/xmm state and dump it. */
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_setup_then_fxsave(buf1, 0);
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("\nBEFORE\n");
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   show(buf1, xx);
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Zeroise x87/xmm state and dump it, to show that the
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      regs have been cleared out. */
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_zeroise();
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_fxsave(buf2, 0);
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("\nZEROED\n");
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   show(buf2, xx);
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Reload x87/xmm state from buf1 and dump it in buf3. */
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_fxrstor(buf1, 0);
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_fxsave(buf3, 0);
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("\nRESTORED\n");
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   show(buf3, xx);
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("\n-------- FXSAVE 64 (REX.W == 1) --------\n\n");
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   memset(buf1, 0x55, 512);
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   memset(buf2, 0x55, 512);
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   memset(buf3, 0x55, 512);
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Load up x87/xmm state and dump it. */
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_setup_then_fxsave(buf1, 1);
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("\nBEFORE\n");
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   show(buf1, xx);
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Zeroise x87/xmm state and dump it, to show that the
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      regs have been cleared out. */
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_zeroise();
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_fxsave(buf2, 1);
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("\nZEROED\n");
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   show(buf2, xx);
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Reload x87/xmm state from buf1 and dump it in buf3. */
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_fxrstor(buf1, 1);
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do_fxsave(buf3, 1);
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("\nRESTORED\n");
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   show(buf3, xx);
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   free(buf1); free(buf2); free(buf3);
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
211