1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Test for a number of SSE instructions which were seen in the wild
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   with a bogus (irrelevant) REX.W bit in their prefixes.  Some just
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   have REX = 0x48 where REX.W is irrelevant, hence the whole REX
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   prefix is pointless.  Probably related to #133962. */
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "tests/malloc.h"
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  unsigned char  UChar;
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct { __attribute__((aligned(16))) UChar b[16]; }
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UWord128;
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct { UWord128 reg[16]; }
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   XMMRegs;
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct { UWord128 dqw[5]; }
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Mem;
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid pp_UWord128 ( UWord128* w ) {
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char buf[3];
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 15; i >= 0; i--) {
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      buf[2] = 0;
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      sprintf(buf, "%02x", (unsigned int)w->b[i]);
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assert(buf[2] == 0);
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (buf[0] == '0') buf[0] = '.';
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (buf[1] == '0') buf[1] = '.';
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s", buf);
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid pp_XMMRegs ( char* who, XMMRegs* regs ) {
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf ("%s (xmms in order [15..0]) {\n", who );
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 16; i++) {
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("  %%xmm%2d ", i);
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      pp_UWord128( &regs->reg[i] );
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\n");
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("}\n");
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid pp_Mem ( char* who, Mem* mem ) {
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf ("%s (dqws in order [15 .. 0]) {\n", who );
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 5; i++) {
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("  [%d]    ", i);
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      pp_UWord128( &mem->dqw[i] );
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("\n");
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("}\n");
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid xor_UWord128( UWord128* src, UWord128* dst ) {
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 16; i++)
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      dst->b[i] ^= src->b[i];
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid xor_XMMRegs ( XMMRegs* src, XMMRegs* dst ) {
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 16; i++)
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      xor_UWord128( &src->reg[i], &dst->reg[i] );
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid xor_Mem ( Mem* src, Mem* dst ) {
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i;
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 5; i++)
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      xor_UWord128( &src->dqw[i], &dst->dqw[i] );
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid setup_regs_mem ( XMMRegs* regs, Mem* mem ) {
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int ctr, i, j;
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ctr = 0;
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 16; i++) {
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j = 0; j < 16; j++)
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        regs->reg[i].b[j] = 0x51 + (ctr++ % 7);
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 5; i++) {
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j = 0; j < 16; j++)
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mem->dqw[i].b[j] = 0x52 + (ctr++ % 13);
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid before_test ( XMMRegs* regs, Mem* mem ) {
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   setup_regs_mem( regs, mem );
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid after_test ( char* who, XMMRegs* regs, Mem* mem ) {
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   XMMRegs rdiff;
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Mem     mdiff;
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char s[128];
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   setup_regs_mem( &rdiff, &mdiff );
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   xor_XMMRegs( regs, &rdiff );
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   xor_Mem( mem, &mdiff );
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   sprintf(s, "after \"%s\"", who );
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pp_Mem( s, &mdiff );
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pp_XMMRegs( s, &rdiff );
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("\n");
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LOAD_XMMREGS_from_r14       \
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd   0(%%r14),  %%xmm0\n" \
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd  16(%%r14),  %%xmm1\n" \
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd  32(%%r14),  %%xmm2\n" \
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd  48(%%r14),  %%xmm3\n" \
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd  64(%%r14),  %%xmm4\n" \
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd  80(%%r14),  %%xmm5\n" \
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd  96(%%r14),  %%xmm6\n" \
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd 112(%%r14),  %%xmm7\n" \
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd 128(%%r14),  %%xmm8\n" \
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd 144(%%r14),  %%xmm9\n" \
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd 160(%%r14), %%xmm10\n" \
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd 176(%%r14), %%xmm11\n" \
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd 192(%%r14), %%xmm12\n" \
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd 208(%%r14), %%xmm13\n" \
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd 224(%%r14), %%xmm14\n" \
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd 240(%%r14), %%xmm15\n"
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SAVE_XMMREGS_to_r14         \
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm0,    0(%%r14)\n" \
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm1,   16(%%r14)\n" \
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm2,   32(%%r14)\n" \
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm3,   48(%%r14)\n" \
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm4,   64(%%r14)\n" \
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm5,   80(%%r14)\n" \
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm6,   96(%%r14)\n" \
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm7,  112(%%r14)\n" \
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm8,  128(%%r14)\n" \
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm9,  144(%%r14)\n" \
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm10, 160(%%r14)\n" \
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm11, 176(%%r14)\n" \
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm12, 192(%%r14)\n" \
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm13, 208(%%r14)\n" \
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm14, 224(%%r14)\n" \
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "\tmovupd %%xmm15, 240(%%r14)"
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define XMMREGS \
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", \
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Boilerplate for test */
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rx\n"
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x\n"
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -x + (char*)&mem->dqw[2] )
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "x"
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "", regs, mem );
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   XMMRegs* regs;
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Mem*     mem;
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   regs = memalign16(sizeof(XMMRegs) + 16);
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mem  = memalign16(sizeof(Mem) + 16);
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* addpd mem, reg   66 49 0f 58 48 00  rex.WB addpd  0x0(%r8),%xmm1 */
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%r8\n"
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x49,0x0f,0x58,0x48,0x00\n"
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "r8"
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.WB addpd  0x0(%r8),%xmm1", regs, mem );
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* addsd mem, reg   f2 48 0f 58 27     rex.W addsd  (%rdi),%xmm4 */
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdi\n"
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0xf2,0x48,0x0f,0x58,0x27\n"
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdi"
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W addsd  (%rdi),%xmm4", regs, mem );
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movapd mem, reg  66 48 0f 28 0a     rex.W movapd (%rdx),%xmm1 */
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdx\n"
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x48,0x0f,0x28,0x0a\n"
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdx"
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movapd (%rdx),%xmm1", regs, mem );
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movapd reg, mem  66 48 0f 29 0a     rex.W movapd %xmm1,(%rdx) */
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdx\n"
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x48,0x0f,0x29,0x0a\n"
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdx"
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movapd %xmm1,(%rdx)", regs, mem );
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movaps mem, reg  48 0f 28 42 30     rex.W movaps 0x30(%rdx),%xmm0 */
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdx\n"
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x48,0x0f,0x28,0x42,0x30\n"
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0x30 + (char*)&mem->dqw[2] )
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdx"
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "movaps 0x30(%rdx),%xmm0", regs, mem );
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movaps reg, mem  49 0f 29 48 00     rex.WB movaps %xmm1,0x0(%r8) */
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%r8\n"
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x49,0x0f,0x29,0x48,0x00\n"
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "r8"
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.WB movaps %xmm1,0x0(%r8)", regs, mem );
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movddup mem, reg f2 48 0f 12 2a     rex.W movddup (%rdx),%xmm5 */
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdx\n"
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0xf2,0x48,0x0f,0x12,0x2a\n"
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdx"
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "movddup (%rdx),%xmm5", regs, mem );
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movhpd mem, reg  66 48 0f 16 06     rex.W movhpd (%rsi),%xmm0 */
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rsi\n"
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x48,0x0f,0x16,0x06\n"
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rsi"
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movhpd (%rsi),%xmm0", regs, mem );
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movhpd reg, mem  66 48 0f 17 07     rex.W movhpd %xmm0,(%rdi) */
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdi\n"
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x48,0x0f,0x17,0x07\n"
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdi"
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movhpd %xmm0,(%rdi)", regs, mem );
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movhps mem, reg  48 0f 16 36        rex.W movhps (%rsi),%xmm6 */
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rsi\n"
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x48,0x0f,0x16,0x36\n"
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rsi"
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movhps (%rsi),%xmm6", regs, mem );
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movhps reg, mem  49 0f 17 03        rex.WB movhps %xmm0,(%r11) */
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%r11\n"
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x49,0x0F,0x17,0x03\n" /* rex.WB movhps %xmm0,(%r11) */
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         : /*out*/ : /*in*/ "r"(regs), "r"( 0 + (char*)&mem->dqw[2] )
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "r11"
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.WB movhps %xmm0,(%r11)", regs, mem );
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movlpd mem, reg  66 48 0f 12 4a 00  rex.W movlpd 0x0(%rdx),%xmm1 */
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdx\n"
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x48,0x0f,0x12,0x4a,0x00\n"
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdx"
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movlpd 0x0(%rdx),%xmm1", regs, mem );
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movlpd reg, mem  66 48 0f 13 30     rex.W movlpd %xmm6,(%rax) */
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rax\n"
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x48,0x0f,0x13,0x30\n"
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rax"
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movlpd %xmm6,(%rax)", regs, mem );
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movlps mem, reg  48 0f 12 07        rex.W movlps (%rdi),%xmm0 */
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdi\n"
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x48,0x0f,0x12,0x07\n"
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdi"
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movlps (%rdi),%xmm0", regs, mem );
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movlps reg, mem  49 0f 13 02        rex.WB movlps %xmm0,(%r10) */
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%r10\n"
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x49,0x0f,0x13,0x02\n"
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "r10"
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.WB movlps %xmm0,(%r10)", regs, mem );
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movq mem, reg    f3 48 0f 7e 00     rex.W movq   (%rax),%xmm0 */
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rax\n"
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0xf3,0x48,0x0f,0x7e,0x00\n"
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rax"
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movq (%rax),%xmm0", regs, mem );
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movq reg, mem    66 48 0f d6 00     rex.W movq   %xmm0,(%rax) */
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rax\n"
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x48,0x0f,0xd6,0x00\n"
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rax"
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movq %xmm0,(%rax)", regs, mem );
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movsd mem, reg   f2 48 0f 10 11     rex.W movsd  (%rcx),%xmm2 */
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rcx\n"
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0xf2,0x48,0x0f,0x10,0x11\n"
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rcx"
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movsd (%rcx),%xmm2", regs, mem );
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movsd reg, mem   f2 48 0f 11 3f     rex.W movsd  %xmm7,(%rdi) */
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdi\n"
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0xf2,0x48,0x0f,0x11,0x3f\n"
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdi"
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movsd %xmm7,(%rdi)", regs, mem );
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movss mem, reg   f3 48 0f 10 5e 04  rex.W movss  0x4(%rsi),%xmm3 */
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rsi\n"
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0xf3,0x48,0x0f,0x10,0x5e,0x04\n"
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0x4 + (char*)&mem->dqw[2] )
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rsi"
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movss 0x4(%rsi),%xmm3", regs, mem );
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* movupd reg, mem  66 48 0f 11 07     rex.W movupd %xmm0,(%rdi) */
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdi\n"
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x48,0x0f,0x11,0x07\n"
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdi"
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W movupd %xmm0,(%rdi)", regs, mem );
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* mulpd mem, reg   66 48 0f 59 61 00  rex.W mulpd  0x0(%rcx),%xmm4 */
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rcx\n"
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x66,0x48,0x0f,0x59,0x61,0x00\n"
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rcx"
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W mulpd 0x0(%rcx),%xmm4", regs, mem );
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* mulsd mem, reg   f2 48 0f 59 1f     rex.W mulsd  (%rdi),%xmm3 */
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%rdi\n"
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0xf2,0x48,0x0f,0x59,0x1f\n"
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( -0 + (char*)&mem->dqw[2] )
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "rdi"
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.W mulsd (%rdi),%xmm3", regs, mem );
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* prefetchnt0    49 0f 18 4c f2 a0  rex.WB prefetcht0 -0x60(%r10,%rsi,8) */
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%r10\n"
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\txorq %%rsi, %%rsi\n"
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0x49,0x0f,0x18,0x4c,0xf2,0xa0\n"
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( - -0x60 + (char*)&mem->dqw[2] )
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "r10","rsi"
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.WB prefetcht0 -0x60(%r10,%rsi,8)", regs, mem );
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* subsd mem, reg   f2 49 0f 5c 4d f8  rex.WB subsd  -0x8(%r13),%xmm1 */
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     before_test( regs, mem );
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     __asm__ __volatile__(
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         "movq %0, %%r14\n"
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %1, %%r15\n"
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       LOAD_XMMREGS_from_r14
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\tmovq %%r15, %%r13\n"
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       "\t.byte 0xf2,0x49,0x0f,0x5c,0x4d,0xf8\n"
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       SAVE_XMMREGS_to_r14
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : /*out*/ : /*in*/ "r"(regs), "r"( - -0x8 + (char*)&mem->dqw[2] )
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    : /*trash*/ "r14","r15","memory", XMMREGS,
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                "r13"
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     );
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     after_test( "rex.WB subsd  -0x8(%r13),%xmm1", regs, mem );
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(regs);
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(mem);
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
603