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( ®s->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