116900515214912557dfd35e3b333e0e312b8bc61Keith Whitwell#ifdef USE_X86_ASM 2a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane#if defined(__i386__) || defined(__386__) 3461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 4101d1a658a614d1e2ec02b1e697f6161291af653José Fonseca#include "main/imports.h" 5461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell#include "x86sse.h" 6461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 7002d0ad3e96a22350cdeafc845ec3233224b14e4Keith Whitwell#define DISASSEM 0 8461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell#define X86_TWOB 0x0f 9461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 10987e9188d25e7c49eb7e6fe64dbe63dd2cfc25efVinson Lee#if 0 11a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanestatic unsigned char *cptr( void (*label)() ) 12461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 13a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane return (unsigned char *)(unsigned long)label; 14461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 15987e9188d25e7c49eb7e6fe64dbe63dd2cfc25efVinson Lee#endif 16461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 17a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 18a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanestatic void do_realloc( struct x86_function *p ) 19461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 20a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane if (p->size == 0) { 21a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->size = 1024; 22a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->store = _mesa_exec_malloc(p->size); 23a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->csr = p->store; 24a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane } 25a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane else { 26a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned used = p->csr - p->store; 27a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char *tmp = p->store; 28a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->size *= 2; 29a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->store = _mesa_exec_malloc(p->size); 30a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane memcpy(p->store, tmp, used); 31a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->csr = p->store + used; 32a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane _mesa_exec_free(tmp); 33a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane } 34461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 35461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 36a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane/* Emit bytes to the instruction stream: 37a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane */ 38a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanestatic unsigned char *reserve( struct x86_function *p, int bytes ) 39461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 40a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane if (p->csr + bytes - p->store > p->size) 41a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane do_realloc(p); 42a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 43a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane { 44a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char *csr = p->csr; 45a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->csr += bytes; 46a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane return csr; 47461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell } 48461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 49461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 50a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 51a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 52a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanestatic void emit_1b( struct x86_function *p, char b0 ) 53461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 54a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane char *csr = (char *)reserve(p, 1); 55a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane *csr = b0; 56461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 57461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 58a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanestatic void emit_1i( struct x86_function *p, int i0 ) 59461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 60a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane int *icsr = (int *)reserve(p, sizeof(i0)); 61a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane *icsr = i0; 62461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 63461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 64a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanestatic void emit_1ub( struct x86_function *p, unsigned char b0 ) 65461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 66a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char *csr = reserve(p, 1); 67a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane *csr++ = b0; 68461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 69461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 70a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanestatic void emit_2ub( struct x86_function *p, unsigned char b0, unsigned char b1 ) 71a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 72a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char *csr = reserve(p, 2); 73a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane *csr++ = b0; 74a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane *csr++ = b1; 75a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 76461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 77a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanestatic void emit_3ub( struct x86_function *p, unsigned char b0, unsigned char b1, unsigned char b2 ) 78a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 79a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char *csr = reserve(p, 3); 80a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane *csr++ = b0; 81a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane *csr++ = b1; 82a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane *csr++ = b2; 83a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 84461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 85461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 86461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell/* Build a modRM byte + possible displacement. No treatment of SIB 87461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell * indexing. BZZT - no way to encode an absolute address. 88461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell */ 89461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellstatic void emit_modrm( struct x86_function *p, 90461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg reg, 91461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg regmem ) 92461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 93a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char val = 0; 94461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 95461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(reg.mod == mod_REG); 96461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 97461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell val |= regmem.mod << 6; /* mod field */ 98461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell val |= reg.idx << 3; /* reg field */ 99461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell val |= regmem.idx; /* r/m field */ 100461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 101a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_1ub(p, val); 102461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 103461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell /* Oh-oh we've stumbled into the SIB thing. 104461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell */ 105dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell if (regmem.file == file_REG32 && 106dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell regmem.idx == reg_SP) { 107a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_1ub(p, 0x24); /* simplistic! */ 108461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell } 109461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 110461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell switch (regmem.mod) { 111461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell case mod_REG: 112461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell case mod_INDIRECT: 113461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell break; 114461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell case mod_DISP8: 1156acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1b(p, regmem.disp); 116461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell break; 117461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell case mod_DISP32: 1186acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1i(p, regmem.disp); 119461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell break; 120461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell default: 121461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(0); 122461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell break; 123461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell } 124461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 125461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1260cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 1270cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellstatic void emit_modrm_noreg( struct x86_function *p, 128a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned op, 1290cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg regmem ) 1300cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 1310cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg dummy = x86_make_reg(file_REG32, op); 1320cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm(p, dummy, regmem); 1330cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 1340cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 135461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell/* Many x86 instructions have two opcodes to cope with the situations 136461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell * where the destination is a register or memory reference 137461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell * respectively. This function selects the correct opcode based on 138461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell * the arguments presented. 139461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell */ 140461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellstatic void emit_op_modrm( struct x86_function *p, 141a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char op_dst_is_reg, 142a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char op_dst_is_mem, 143461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 144461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 1450cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 146461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell switch (dst.mod) { 147461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell case mod_REG: 148a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_1ub(p, op_dst_is_reg); 149461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm(p, dst, src); 150461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell break; 151461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell case mod_INDIRECT: 152461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell case mod_DISP32: 153461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell case mod_DISP8: 154461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(src.mod == mod_REG); 155a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_1ub(p, op_dst_is_mem); 156461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm(p, src, dst); 157461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell break; 158461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell default: 159461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(0); 160461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell break; 161461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell } 162461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 163461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 164461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 165461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 166461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 167461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 168461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 169461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 170461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell/* Create and manipulate registers and regmem values: 171461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell */ 1729ac9605de156408580b81ba7e2780bd3f5372c6dMichal Krolstruct x86_reg x86_make_reg( enum x86_reg_file file, 1739ac9605de156408580b81ba7e2780bd3f5372c6dMichal Krol enum x86_reg_name idx ) 174461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 175461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg reg; 176461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 177461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell reg.file = file; 178461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell reg.idx = idx; 179461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell reg.mod = mod_REG; 180461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell reg.disp = 0; 181461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 182461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell return reg; 183461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 184461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 185461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellstruct x86_reg x86_make_disp( struct x86_reg reg, 186a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane int disp ) 187461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 188461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(reg.file == file_REG32); 189461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 190461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell if (reg.mod == mod_REG) 191461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell reg.disp = disp; 192461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell else 193461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell reg.disp += disp; 194461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 195461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell if (reg.disp == 0) 196461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell reg.mod = mod_INDIRECT; 197461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell else if (reg.disp <= 127 && reg.disp >= -128) 198461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell reg.mod = mod_DISP8; 199461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell else 200461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell reg.mod = mod_DISP32; 201461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 202461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell return reg; 203461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 204461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 205461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellstruct x86_reg x86_deref( struct x86_reg reg ) 206461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 207461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell return x86_make_disp(reg, 0); 208461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 209461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 210461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellstruct x86_reg x86_get_base_reg( struct x86_reg reg ) 211461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 212461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell return x86_make_reg( reg.file, reg.idx ); 213461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 214461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 215a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihaneunsigned char *x86_get_label( struct x86_function *p ) 216461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 217461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell return p->csr; 218461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 219461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 2200cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 2210cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 2220cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/*********************************************************************** 2230cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * x86 instructions 2240cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 2250cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 2260cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 227461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_jcc( struct x86_function *p, 2289ac9605de156408580b81ba7e2780bd3f5372c6dMichal Krol enum x86_cc cc, 229a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char *label ) 230461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 231a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane int offset = label - (x86_get_label(p) + 2); 232461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 233461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell if (offset <= 127 && offset >= -128) { 234461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, 0x70 + cc); 235a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_1b(p, (char) offset); 236461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell } 237461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell else { 238461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell offset = label - (x86_get_label(p) + 6); 239461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_2ub(p, 0x0f, 0x80 + cc); 240461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1i(p, offset); 241461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell } 242461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 243461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 244461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell/* Always use a 32bit offset for forward jumps: 245461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell */ 246a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihaneunsigned char *x86_jcc_forward( struct x86_function *p, 2479ac9605de156408580b81ba7e2780bd3f5372c6dMichal Krol enum x86_cc cc ) 248461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 249461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_2ub(p, 0x0f, 0x80 + cc); 250461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1i(p, 0); 251461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell return x86_get_label(p); 2526acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol} 2536acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol 254a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihaneunsigned char *x86_jmp_forward( struct x86_function *p) 2556acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol{ 2566acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1ub(p, 0xe9); 2576acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1i(p, 0); 2586acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol return x86_get_label(p); 2596acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol} 2606acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol 261a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihaneunsigned char *x86_call_forward( struct x86_function *p) 2626acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol{ 2636acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1ub(p, 0xe8); 2646acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1i(p, 0); 2656acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol return x86_get_label(p); 266461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 267461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 268461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell/* Fixup offset from forward jump: 269461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell */ 270461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_fixup_fwd_jump( struct x86_function *p, 271a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char *fixup ) 272461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 273461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell *(int *)(fixup - 4) = x86_get_label(p) - fixup; 2746acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol} 2756acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol 276a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid x86_jmp( struct x86_function *p, unsigned char *label) 2776acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol{ 2786acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1ub(p, 0xe9); 2796acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1i(p, label - x86_get_label(p) - 4); 2806acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol} 2816acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol 282a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane#if 0 283a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane/* This doesn't work once we start reallocating & copying the 284a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane * generated code on buffer fills, because the call is relative to the 285a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane * current pc. 286a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane */ 287a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid x86_call( struct x86_function *p, void (*label)()) 2886acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol{ 2896acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1ub(p, 0xe8); 290a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_1i(p, cptr(label) - x86_get_label(p) - 4); 291a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 292a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane#else 293a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid x86_call( struct x86_function *p, struct x86_reg reg) 294a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 295a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_1ub(p, 0xff); 29616900515214912557dfd35e3b333e0e312b8bc61Keith Whitwell emit_modrm_noreg(p, 2, reg); 2976acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol} 298a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane#endif 299a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 3006acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol 3016acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol/* michal: 3026acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol * Temporary. As I need immediate operands, and dont want to mess with the codegen, 3036acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol * I load the immediate into general purpose register and use it. 3046acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol */ 305a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm ) 3066acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol{ 3076acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol assert(dst.mod == mod_REG); 3086acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1ub(p, 0xb8 + dst.idx); 3096acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_1i(p, imm); 310461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 311461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 312461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_push( struct x86_function *p, 313461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg reg ) 314461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 315461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(reg.mod == mod_REG); 316461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, 0x50 + reg.idx); 317461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell p->stack_offset += 4; 318461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 319461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 320461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_pop( struct x86_function *p, 321461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg reg ) 322461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 323461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(reg.mod == mod_REG); 324461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, 0x58 + reg.idx); 325461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell p->stack_offset -= 4; 326461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 327461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 328461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_inc( struct x86_function *p, 329461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg reg ) 330461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 331461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(reg.mod == mod_REG); 332461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, 0x40 + reg.idx); 333461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 334461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 335461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_dec( struct x86_function *p, 336461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg reg ) 337461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 338461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(reg.mod == mod_REG); 339461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, 0x48 + reg.idx); 340461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 341461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 342461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_ret( struct x86_function *p ) 343461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 344461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, 0xc3); 345461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 346461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 3470cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x86_sahf( struct x86_function *p ) 348461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 3490cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0x9e); 350461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 351461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 352461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_mov( struct x86_function *p, 353461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 354461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 355461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 356461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_op_modrm( p, 0x8b, 0x89, dst, src ); 357461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 358461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 359461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_xor( struct x86_function *p, 360461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 361461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 362461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 363461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_op_modrm( p, 0x33, 0x31, dst, src ); 364461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 365461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 366461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_cmp( struct x86_function *p, 367461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 368461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 369461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 370461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_op_modrm( p, 0x3b, 0x39, dst, src ); 371461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 372461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 3730cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x86_lea( struct x86_function *p, 3740cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg dst, 3750cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg src ) 376461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 3770cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0x8d); 3780cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm( p, dst, src ); 379461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 380461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 3810cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x86_test( struct x86_function *p, 382461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 383461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 384461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 3850cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0x85); 3860cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm( p, dst, src ); 3876acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol} 3886acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol 3896acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krolvoid x86_add( struct x86_function *p, 3906acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol struct x86_reg dst, 3916acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol struct x86_reg src ) 3926acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol{ 3936acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_op_modrm(p, 0x03, 0x01, dst, src ); 3946acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol} 3956acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol 3966acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krolvoid x86_mul( struct x86_function *p, 3976acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol struct x86_reg src ) 3986acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol{ 3996acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol assert (src.file == file_REG32 && src.mod == mod_REG); 4006acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_op_modrm(p, 0xf7, 0, x86_make_reg (file_REG32, reg_SP), src ); 4016acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol} 4026acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol 4036acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krolvoid x86_sub( struct x86_function *p, 4046acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol struct x86_reg dst, 4056acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol struct x86_reg src ) 4066acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol{ 4076acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol emit_op_modrm(p, 0x2b, 0x29, dst, src ); 408461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 409461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 410edefc658e4374fea96404715ce176b24942322d3Michal Krolvoid x86_or( struct x86_function *p, 411edefc658e4374fea96404715ce176b24942322d3Michal Krol struct x86_reg dst, 412edefc658e4374fea96404715ce176b24942322d3Michal Krol struct x86_reg src ) 413edefc658e4374fea96404715ce176b24942322d3Michal Krol{ 414edefc658e4374fea96404715ce176b24942322d3Michal Krol emit_op_modrm( p, 0x0b, 0x09, dst, src ); 415edefc658e4374fea96404715ce176b24942322d3Michal Krol} 416edefc658e4374fea96404715ce176b24942322d3Michal Krol 417edefc658e4374fea96404715ce176b24942322d3Michal Krolvoid x86_and( struct x86_function *p, 418edefc658e4374fea96404715ce176b24942322d3Michal Krol struct x86_reg dst, 419edefc658e4374fea96404715ce176b24942322d3Michal Krol struct x86_reg src ) 420edefc658e4374fea96404715ce176b24942322d3Michal Krol{ 421edefc658e4374fea96404715ce176b24942322d3Michal Krol emit_op_modrm( p, 0x23, 0x21, dst, src ); 422edefc658e4374fea96404715ce176b24942322d3Michal Krol} 423edefc658e4374fea96404715ce176b24942322d3Michal Krol 4240cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 4250cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 4260cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/*********************************************************************** 4270cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * SSE instructions 4280cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 429461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 430461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 431461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse_movss( struct x86_function *p, 432461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 433461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 434461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 435461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_2ub(p, 0xF3, X86_TWOB); 436461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_op_modrm( p, 0x10, 0x11, dst, src ); 437461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 438461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 439461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse_movaps( struct x86_function *p, 440461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 441461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 442461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 443461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, X86_TWOB); 444461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_op_modrm( p, 0x28, 0x29, dst, src ); 445461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 446461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 447461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse_movups( struct x86_function *p, 448461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 449461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 450461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 451461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, X86_TWOB); 452461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_op_modrm( p, 0x10, 0x11, dst, src ); 453461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 454461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 455461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse_movhps( struct x86_function *p, 456461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 457461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 458461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 459461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(dst.mod != mod_REG || src.mod != mod_REG); 460461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, X86_TWOB); 461461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_op_modrm( p, 0x16, 0x17, dst, src ); /* cf movlhps */ 462461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 463461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 464461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse_movlps( struct x86_function *p, 465461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 466461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 467461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 468461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(dst.mod != mod_REG || src.mod != mod_REG); 469461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_1ub(p, X86_TWOB); 470461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_op_modrm( p, 0x12, 0x13, dst, src ); /* cf movhlps */ 471461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 472461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 473dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwellvoid sse_maxps( struct x86_function *p, 474dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg dst, 475dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg src ) 476dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell{ 477dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_2ub(p, X86_TWOB, 0x5F); 478dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_modrm( p, dst, src ); 479dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell} 480dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell 481fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheideggervoid sse_maxss( struct x86_function *p, 482fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger struct x86_reg dst, 483fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger struct x86_reg src ) 484fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger{ 485fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger emit_3ub(p, 0xF3, X86_TWOB, 0x5F); 486fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger emit_modrm( p, dst, src ); 487fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger} 488fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger 489dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwellvoid sse_divss( struct x86_function *p, 490dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg dst, 491dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg src ) 492dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell{ 493dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_3ub(p, 0xF3, X86_TWOB, 0x5E); 494dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_modrm( p, dst, src ); 495dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell} 496dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell 497dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwellvoid sse_minps( struct x86_function *p, 498dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg dst, 499dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg src ) 500dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell{ 501dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_2ub(p, X86_TWOB, 0x5D); 502dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_modrm( p, dst, src ); 503dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell} 504dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell 505dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwellvoid sse_subps( struct x86_function *p, 506dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg dst, 507dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg src ) 508dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell{ 509dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_2ub(p, X86_TWOB, 0x5C); 510dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_modrm( p, dst, src ); 511dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell} 512dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell 513461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse_mulps( struct x86_function *p, 514461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 515461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 516461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 517461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_2ub(p, X86_TWOB, 0x59); 518461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 519461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 520461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 521fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheideggervoid sse_mulss( struct x86_function *p, 522fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger struct x86_reg dst, 523fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger struct x86_reg src ) 524fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger{ 525fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger emit_3ub(p, 0xF3, X86_TWOB, 0x59); 526fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger emit_modrm( p, dst, src ); 527fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger} 528fe57ed4f2566e30384d0c786998842405d8e8990Roland Scheidegger 529461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse_addps( struct x86_function *p, 530461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 531461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 532461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 533461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_2ub(p, X86_TWOB, 0x58); 534461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 535461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 536461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 537dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwellvoid sse_addss( struct x86_function *p, 538dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg dst, 539dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg src ) 540dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell{ 541dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_3ub(p, 0xF3, X86_TWOB, 0x58); 542dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_modrm( p, dst, src ); 543dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell} 544dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell 545a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid sse_andnps( struct x86_function *p, 546a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg dst, 547a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg src ) 548a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 549a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_2ub(p, X86_TWOB, 0x55); 550a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_modrm( p, dst, src ); 551a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 552a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 553dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwellvoid sse_andps( struct x86_function *p, 554dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg dst, 555dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg src ) 556dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell{ 557dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_2ub(p, X86_TWOB, 0x54); 558dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_modrm( p, dst, src ); 559dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell} 560dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell 561a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid sse_rsqrtps( struct x86_function *p, 562a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg dst, 563a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg src ) 564a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 565a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_2ub(p, X86_TWOB, 0x52); 566a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_modrm( p, dst, src ); 567a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 568dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell 569dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwellvoid sse_rsqrtss( struct x86_function *p, 570dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg dst, 571dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell struct x86_reg src ) 572dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell{ 573dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_3ub(p, 0xF3, X86_TWOB, 0x52); 574dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell emit_modrm( p, dst, src ); 575dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell 576dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell} 577dce3a91a8d755e394d80b6d594fb3114eed67e49Keith Whitwell 578461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse_movhlps( struct x86_function *p, 579461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 580461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 581461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 582461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(dst.mod == mod_REG && src.mod == mod_REG); 583461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_2ub(p, X86_TWOB, 0x12); 584461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 585461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 586461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 587461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse_movlhps( struct x86_function *p, 588461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 589461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 590461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 591461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(dst.mod == mod_REG && src.mod == mod_REG); 592461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_2ub(p, X86_TWOB, 0x16); 593461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 594461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 595461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 596a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid sse_orps( struct x86_function *p, 597a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg dst, 598a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg src ) 599a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 600a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_2ub(p, X86_TWOB, 0x56); 601a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_modrm( p, dst, src ); 602a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 603a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 604a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid sse_xorps( struct x86_function *p, 605a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg dst, 606a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg src ) 607a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 608a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_2ub(p, X86_TWOB, 0x57); 609a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_modrm( p, dst, src ); 610a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 6110cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 6120cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid sse_cvtps2pi( struct x86_function *p, 6130cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg dst, 6140cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg src ) 6150cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 6160cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.file == file_MMX && 6170cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell (src.file == file_XMM || src.mod != mod_REG)); 6180cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 6190cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell p->need_emms = 1; 6200cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 6210cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, X86_TWOB, 0x2d); 6220cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm( p, dst, src ); 6230cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 6240cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 6250cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 6260cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/* Shufps can also be used to implement a reduced swizzle when dest == 6270cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * arg0. 6280cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 6290cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid sse_shufps( struct x86_function *p, 6300cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg dest, 6310cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg arg0, 632a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char shuf) 6330cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 6340cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, X86_TWOB, 0xC6); 6350cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm(p, dest, arg0); 6360cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, shuf); 6370cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 6380cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 6390cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid sse_cmpps( struct x86_function *p, 6400cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg dest, 6410cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg arg0, 642a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char cc) 6430cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 6440cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, X86_TWOB, 0xC2); 6450cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm(p, dest, arg0); 6460cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, cc); 6470cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 6480cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 649a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid sse_pmovmskb( struct x86_function *p, 650a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg dest, 651a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg src) 652a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 653a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_3ub(p, 0x66, X86_TWOB, 0xD7); 654a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_modrm(p, dest, src); 655a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 656a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 6570cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/*********************************************************************** 6580cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * SSE2 instructions 6590cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 6600cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 6610cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/** 6620cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * Perform a reduced swizzle: 6630cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 6640cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid sse2_pshufd( struct x86_function *p, 6650cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg dest, 6660cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg arg0, 667a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char shuf) 6680cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 6690cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_3ub(p, 0x66, X86_TWOB, 0x70); 6700cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm(p, dest, arg0); 6710cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, shuf); 6720cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 6730cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 674a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid sse2_cvttps2dq( struct x86_function *p, 675a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg dst, 676a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg src ) 677a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 678a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_3ub( p, 0xF3, X86_TWOB, 0x5B ); 679a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_modrm( p, dst, src ); 680a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 681a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 682461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse2_cvtps2dq( struct x86_function *p, 683461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 684461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 685461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 686461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_3ub(p, 0x66, X86_TWOB, 0x5B); 687461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 688461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 689461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 690461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse2_packssdw( struct x86_function *p, 691461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 692461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 693461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 694461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_3ub(p, 0x66, X86_TWOB, 0x6B); 695461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 696461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 697461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 698461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse2_packsswb( struct x86_function *p, 699461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 700461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 701461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 702461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_3ub(p, 0x66, X86_TWOB, 0x63); 703461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 704461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 705461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 706461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid sse2_packuswb( struct x86_function *p, 707461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 708461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 709461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 710461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_3ub(p, 0x66, X86_TWOB, 0x67); 711461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 712461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 713461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 714a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid sse2_rcpps( struct x86_function *p, 715a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg dst, 716a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane struct x86_reg src ) 717a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 718a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_2ub(p, X86_TWOB, 0x53); 719a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane emit_modrm( p, dst, src ); 720a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 721a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 7220cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid sse2_rcpss( struct x86_function *p, 7230cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg dst, 7240cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg src ) 725461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 7260cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_3ub(p, 0xF3, X86_TWOB, 0x53); 7270cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm( p, dst, src ); 7280cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 729461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 7300cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid sse2_movd( struct x86_function *p, 7310cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg dst, 7320cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg src ) 7330cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7340cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0x66, X86_TWOB); 7350cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_op_modrm( p, 0x6e, 0x7e, dst, src ); 7360cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 737461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 7380cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7390cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7400cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7410cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/*********************************************************************** 7420cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * x87 instructions 7430cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 7440cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fist( struct x86_function *p, struct x86_reg dst ) 7450cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7460cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xdb); 7470cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, 2, dst); 7480cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 7490cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7500cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fistp( struct x86_function *p, struct x86_reg dst ) 7510cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7520cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xdb); 7530cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, 3, dst); 7540cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 7550cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7560b9d7e477a5cdf1d7164bc4db56cbebbcff38fdcMichal Krolvoid x87_fild( struct x86_function *p, struct x86_reg arg ) 7570b9d7e477a5cdf1d7164bc4db56cbebbcff38fdcMichal Krol{ 7580b9d7e477a5cdf1d7164bc4db56cbebbcff38fdcMichal Krol emit_1ub(p, 0xdf); 7590b9d7e477a5cdf1d7164bc4db56cbebbcff38fdcMichal Krol emit_modrm_noreg(p, 0, arg); 7600b9d7e477a5cdf1d7164bc4db56cbebbcff38fdcMichal Krol} 7610b9d7e477a5cdf1d7164bc4db56cbebbcff38fdcMichal Krol 7620cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fldz( struct x86_function *p ) 7630cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7640cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xee); 7650cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 7660cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7670cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7680cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fldcw( struct x86_function *p, struct x86_reg arg ) 7690cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7700cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(arg.file == file_REG32); 7710cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(arg.mod != mod_REG); 7720cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xd9); 7730cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, 5, arg); 7740cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 7750cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7760cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fld1( struct x86_function *p ) 7770cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7780cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xe8); 7790cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 7800cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7810cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fldl2e( struct x86_function *p ) 7820cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7830cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xea); 7840cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 7850cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7860cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fldln2( struct x86_function *p ) 7870cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7880cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xed); 7890cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 7900cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7910cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fwait( struct x86_function *p ) 7920cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7930cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0x9b); 7940cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 7950cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7960cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fnclex( struct x86_function *p ) 7970cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 7980cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xdb, 0xe2); 7990cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8000cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8010cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fclex( struct x86_function *p ) 8020cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8030cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell x87_fwait(p); 8040cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell x87_fnclex(p); 8050cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8060cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8070cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8080cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellstatic void x87_arith_op( struct x86_function *p, struct x86_reg dst, struct x86_reg arg, 809a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char dst0ub0, 810a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char dst0ub1, 811a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char arg0ub0, 812a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char arg0ub1, 813a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned char argmem_noreg) 8140cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8150cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.file == file_x87); 8160cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8170cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell if (arg.file == file_x87) { 8180cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell if (dst.idx == 0) 8190cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, dst0ub0, dst0ub1+arg.idx); 8200cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else if (arg.idx == 0) 8210cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, arg0ub0, arg0ub1+arg.idx); 8220cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else 8230cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(0); 8240cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell } 8250cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else if (dst.idx == 0) { 826a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane assert(arg.file == file_REG32); 8270cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xd8); 8280cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, argmem_noreg, arg); 8290cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell } 8300cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else 8310cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(0); 8320cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8330cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8340cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fmul( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8350cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8360cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell x87_arith_op(p, dst, arg, 8370cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xd8, 0xc8, 8380cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xdc, 0xc8, 8390cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 4); 8400cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8410cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8420cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fsub( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8430cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8440cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell x87_arith_op(p, dst, arg, 8450cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xd8, 0xe0, 8460cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xdc, 0xe8, 8470cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 4); 8480cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8490cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8500cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fsubr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8510cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8520cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell x87_arith_op(p, dst, arg, 8530cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xd8, 0xe8, 8540cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xdc, 0xe0, 8550cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 5); 8560cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8570cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8580cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fadd( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8590cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8600cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell x87_arith_op(p, dst, arg, 8610cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xd8, 0xc0, 8620cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xdc, 0xc0, 8630cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0); 8640cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8650cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8660cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fdiv( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8670cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8680cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell x87_arith_op(p, dst, arg, 8690cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xd8, 0xf0, 8700cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xdc, 0xf8, 8710cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 6); 8720cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8730cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8740cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8750cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8760cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell x87_arith_op(p, dst, arg, 8770cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xd8, 0xf8, 8780cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 0xdc, 0xf0, 8790cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 7); 8800cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8810cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8820cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fmulp( struct x86_function *p, struct x86_reg dst ) 8830cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8840cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.file == file_x87); 8850cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.idx >= 1); 8860cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xde, 0xc8+dst.idx); 8870cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8880cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8890cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fsubp( struct x86_function *p, struct x86_reg dst ) 8900cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8910cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.file == file_x87); 8920cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.idx >= 1); 8930cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xde, 0xe8+dst.idx); 8940cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 8950cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 8960cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fsubrp( struct x86_function *p, struct x86_reg dst ) 8970cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 8980cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.file == file_x87); 8990cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.idx >= 1); 9000cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xde, 0xe0+dst.idx); 9010cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9020cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9030cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_faddp( struct x86_function *p, struct x86_reg dst ) 9040cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9050cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.file == file_x87); 9060cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.idx >= 1); 9070cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xde, 0xc0+dst.idx); 9080cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9090cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9100cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fdivp( struct x86_function *p, struct x86_reg dst ) 9110cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9120cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.file == file_x87); 9130cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.idx >= 1); 9140cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xde, 0xf8+dst.idx); 9150cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9160cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9170cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fdivrp( struct x86_function *p, struct x86_reg dst ) 9180cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9190cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.file == file_x87); 9200cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.idx >= 1); 9210cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xde, 0xf0+dst.idx); 9220cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9230cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9240cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fucom( struct x86_function *p, struct x86_reg arg ) 9250cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9260cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(arg.file == file_x87); 9270cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xdd, 0xe0+arg.idx); 9280cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9290cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9300cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fucomp( struct x86_function *p, struct x86_reg arg ) 9310cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9320cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(arg.file == file_x87); 9330cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xdd, 0xe8+arg.idx); 9340cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9350cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9360cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fucompp( struct x86_function *p ) 9370cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9380cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xda, 0xe9); 9390cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9400cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9410cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fxch( struct x86_function *p, struct x86_reg arg ) 9420cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9430cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(arg.file == file_x87); 9440cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xc8+arg.idx); 9450cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9460cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9470cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fabs( struct x86_function *p ) 9480cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9490cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xe1); 9500cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9510cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9520cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fchs( struct x86_function *p ) 9530cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9540cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xe0); 9550cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9560cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9570cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fcos( struct x86_function *p ) 9580cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9590cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xff); 9600cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9610cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9620cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9630cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fprndint( struct x86_function *p ) 9640cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9650cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xfc); 9660cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9670cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9680cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fscale( struct x86_function *p ) 9690cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9700cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xfd); 9710cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9720cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9730cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fsin( struct x86_function *p ) 9740cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9750cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xfe); 9760cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9770cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9780cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fsincos( struct x86_function *p ) 9790cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9800cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xfb); 9810cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9820cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9830cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fsqrt( struct x86_function *p ) 9840cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9850cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xfa); 9860cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9870cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9880cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fxtract( struct x86_function *p ) 9890cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9900cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xf4); 9910cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 9920cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 9930cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/* st0 = (2^st0)-1 9940cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * 9950cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * Restrictions: -1.0 <= st0 <= 1.0 9960cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 9970cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_f2xm1( struct x86_function *p ) 9980cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 9990cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xf0); 10000cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 10010cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10020cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/* st1 = st1 * log2(st0); 10030cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * pop_stack; 10040cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 10050cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fyl2x( struct x86_function *p ) 10060cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 10070cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xf1); 10080cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 10090cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10100cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/* st1 = st1 * log2(st0 + 1.0); 10110cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * pop_stack; 10120cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * 10130cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * A fast operation, with restrictions: -.29 < st0 < .29 10140cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 10150cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fyl2xp1( struct x86_function *p ) 10160cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 10170cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xf9); 10180cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 10190cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10200cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10210cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fld( struct x86_function *p, struct x86_reg arg ) 10220cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 10230cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell if (arg.file == file_x87) 10240cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd9, 0xc0 + arg.idx); 10250cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else { 10260cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xd9); 10270cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, 0, arg); 10280cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell } 10290cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 10300cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10310cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fst( struct x86_function *p, struct x86_reg dst ) 10320cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 10330cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell if (dst.file == file_x87) 10340cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xdd, 0xd0 + dst.idx); 10350cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else { 10360cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xd9); 10370cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, 2, dst); 10380cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell } 10390cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 10400cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10410cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fstp( struct x86_function *p, struct x86_reg dst ) 10420cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 10430cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell if (dst.file == file_x87) 10440cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xdd, 0xd8 + dst.idx); 10450cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else { 10460cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xd9); 10470cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, 3, dst); 10480cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell } 10490cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 10500cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10510cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fcom( struct x86_function *p, struct x86_reg dst ) 10520cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 10530cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell if (dst.file == file_x87) 10540cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd8, 0xd0 + dst.idx); 10550cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else { 10560cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xd8); 10570cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, 2, dst); 10580cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell } 10590cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 10600cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10610cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fcomp( struct x86_function *p, struct x86_reg dst ) 10620cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 10630cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell if (dst.file == file_x87) 10640cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xd8, 0xd8 + dst.idx); 10650cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else { 10660cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xd8); 10670cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, 3, dst); 10680cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell } 10690cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 10700cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10710cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10720cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid x87_fnstsw( struct x86_function *p, struct x86_reg dst ) 10730cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 10740cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(dst.file == file_REG32); 10750cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10760cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell if (dst.idx == reg_AX && 10770cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell dst.mod == mod_REG) 10780cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0xdf, 0xe0); 10790cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell else { 10800cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, 0xdd); 10810cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_modrm_noreg(p, 7, dst); 10820cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell } 10830cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell} 10840cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10850cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10860cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10870cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10880cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/*********************************************************************** 10890cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * MMX instructions 10900cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell */ 10910cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell 10920cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid mmx_emms( struct x86_function *p ) 10930cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell{ 10940cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell assert(p->need_emms); 10950cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_2ub(p, 0x0f, 0x77); 10960cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell p->need_emms = 0; 1097461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1098461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1099461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid mmx_packssdw( struct x86_function *p, 1100461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 1101461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 1102461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 1103461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(dst.file == file_MMX && 1104461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell (src.file == file_MMX || src.mod != mod_REG)); 1105461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1106461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell p->need_emms = 1; 1107461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1108461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_2ub(p, X86_TWOB, 0x6b); 1109461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 1110461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1111461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1112461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid mmx_packuswb( struct x86_function *p, 1113461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 1114461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 1115461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 1116461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell assert(dst.file == file_MMX && 1117461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell (src.file == file_MMX || src.mod != mod_REG)); 1118461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1119461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell p->need_emms = 1; 1120461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1121461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_2ub(p, X86_TWOB, 0x67); 1122461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell emit_modrm( p, dst, src ); 1123461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1124461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 11250cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid mmx_movd( struct x86_function *p, 1126461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg dst, 1127461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell struct x86_reg src ) 1128461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 11290cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell p->need_emms = 1; 11300cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, X86_TWOB); 11310cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_op_modrm( p, 0x6e, 0x7e, dst, src ); 1132461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1133461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 11340cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwellvoid mmx_movq( struct x86_function *p, 11350cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg dst, 11360cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell struct x86_reg src ) 1137461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 11380cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell p->need_emms = 1; 11390cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_1ub(p, X86_TWOB); 11400cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell emit_op_modrm( p, 0x6f, 0x7f, dst, src ); 1141461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1142461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1143461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 11440cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell/*********************************************************************** 11450cfbd849ecaa59b842eca303d581d4ce90440bacKeith Whitwell * Helper functions 1146461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell */ 1147461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1148461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1149461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell/* Retreive a reference to one of the function arguments, taking into 1150461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell * account any push/pop activity: 1151461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell */ 1152461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellstruct x86_reg x86_fn_arg( struct x86_function *p, 1153a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane unsigned arg ) 1154461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 1155461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell return x86_make_disp(x86_make_reg(file_REG32, reg_SP), 1156461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell p->stack_offset + arg * 4); /* ??? */ 1157461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1158461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1159461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1160a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihanevoid x86_init_func( struct x86_function *p ) 11616acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol{ 1162a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->size = 0; 1163a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->store = NULL; 1164a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->csr = p->store; 1165a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane} 1166a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane 1167b5292b4d9967f3a3a35cd7f1909b46fab9179111Brianint x86_init_func_size( struct x86_function *p, unsigned code_size ) 1168a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane{ 1169a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->size = code_size; 11706acf1e93a291511cfb20b0e2aeda6e71ceb62a62Michal Krol p->store = _mesa_exec_malloc(code_size); 1171a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->csr = p->store; 1172b5292b4d9967f3a3a35cd7f1909b46fab9179111Brian return p->store != NULL; 1173461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1174461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1175461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86_release_func( struct x86_function *p ) 1176461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 1177a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane _mesa_exec_free(p->store); 1178a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->store = NULL; 1179a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->csr = NULL; 1180a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane p->size = 0; 1181461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1182461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1183461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1184461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid (*x86_get_func( struct x86_function *p ))(void) 1185461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 1186a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane if (DISASSEM && p->store) 1187298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("disassemble %p %p\n", p->store, p->csr); 1188a3b5ae783e18040349f1736c2ad812e0ec24a7b8Alan Hourihane return (void (*)(void)) (unsigned long) p->store; 1189461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1190461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1191461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell#else 1192461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1193461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwellvoid x86sse_dummy( void ) 1194461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell{ 1195461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell} 1196461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell 1197461a2a799a99a8c8aba7e09c96d7c2e5c3196dcfKeith Whitwell#endif 119816900515214912557dfd35e3b333e0e312b8bc61Keith Whitwell 119916900515214912557dfd35e3b333e0e312b8bc61Keith Whitwell#else /* USE_X86_ASM */ 120016900515214912557dfd35e3b333e0e312b8bc61Keith Whitwell 120116900515214912557dfd35e3b333e0e312b8bc61Keith Whitwellint x86sse_c_dummy_var; /* silence warning */ 120216900515214912557dfd35e3b333e0e312b8bc61Keith Whitwell 120316900515214912557dfd35e3b333e0e312b8bc61Keith Whitwell#endif /* USE_X86_ASM */ 1204