13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#ifdef USE_X86_ASM 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if defined(__i386__) || defined(__386__) 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "main/imports.h" 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "x86sse.h" 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define DISASSEM 0 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define X86_TWOB 0x0f 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if 0 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic unsigned char *cptr( void (*label)() ) 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return (unsigned char *)(unsigned long)label; 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void do_realloc( struct x86_function *p ) 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (p->size == 0) { 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->size = 1024; 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->store = _mesa_exec_malloc(p->size); 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->csr = p->store; 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned used = p->csr - p->store; 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char *tmp = p->store; 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->size *= 2; 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->store = _mesa_exec_malloc(p->size); 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org memcpy(p->store, tmp, used); 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->csr = p->store + used; 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org _mesa_exec_free(tmp); 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Emit bytes to the instruction stream: 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic unsigned char *reserve( struct x86_function *p, int bytes ) 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (p->csr + bytes - p->store > p->size) 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org do_realloc(p); 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org { 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char *csr = p->csr; 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->csr += bytes; 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return csr; 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void emit_1b( struct x86_function *p, char b0 ) 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org char *csr = (char *)reserve(p, 1); 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *csr = b0; 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void emit_1i( struct x86_function *p, int i0 ) 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org int *icsr = (int *)reserve(p, sizeof(i0)); 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *icsr = i0; 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void emit_1ub( struct x86_function *p, unsigned char b0 ) 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char *csr = reserve(p, 1); 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *csr++ = b0; 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void emit_2ub( struct x86_function *p, unsigned char b0, unsigned char b1 ) 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char *csr = reserve(p, 2); 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *csr++ = b0; 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *csr++ = b1; 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void emit_3ub( struct x86_function *p, unsigned char b0, unsigned char b1, unsigned char b2 ) 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char *csr = reserve(p, 3); 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *csr++ = b0; 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *csr++ = b1; 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *csr++ = b2; 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Build a modRM byte + possible displacement. No treatment of SIB 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * indexing. BZZT - no way to encode an absolute address. 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void emit_modrm( struct x86_function *p, 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg reg, 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg regmem ) 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char val = 0; 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(reg.mod == mod_REG); 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org val |= regmem.mod << 6; /* mod field */ 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org val |= reg.idx << 3; /* reg field */ 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org val |= regmem.idx; /* r/m field */ 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, val); 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Oh-oh we've stumbled into the SIB thing. 1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (regmem.file == file_REG32 && 1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org regmem.idx == reg_SP) { 1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x24); /* simplistic! */ 1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (regmem.mod) { 1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case mod_REG: 1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case mod_INDIRECT: 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case mod_DISP8: 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1b(p, regmem.disp); 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case mod_DISP32: 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1i(p, regmem.disp); 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(0); 1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void emit_modrm_noreg( struct x86_function *p, 1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned op, 1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg regmem ) 1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dummy = x86_make_reg(file_REG32, op); 1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm(p, dummy, regmem); 1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Many x86 instructions have two opcodes to cope with the situations 1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * where the destination is a register or memory reference 1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * respectively. This function selects the correct opcode based on 1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the arguments presented. 1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void emit_op_modrm( struct x86_function *p, 1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char op_dst_is_reg, 1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char op_dst_is_mem, 1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (dst.mod) { 1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case mod_REG: 1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, op_dst_is_reg); 1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm(p, dst, src); 1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case mod_INDIRECT: 1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case mod_DISP32: 1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case mod_DISP8: 1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(src.mod == mod_REG); 1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, op_dst_is_mem); 1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm(p, src, dst); 1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(0); 1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Create and manipulate registers and regmem values: 1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct x86_reg x86_make_reg( enum x86_reg_file file, 1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org enum x86_reg_name idx ) 1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg reg; 1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org reg.file = file; 1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org reg.idx = idx; 1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org reg.mod = mod_REG; 1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org reg.disp = 0; 1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return reg; 1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct x86_reg x86_make_disp( struct x86_reg reg, 1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org int disp ) 1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(reg.file == file_REG32); 1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (reg.mod == mod_REG) 1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org reg.disp = disp; 1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else 1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org reg.disp += disp; 1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (reg.disp == 0) 1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org reg.mod = mod_INDIRECT; 1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else if (reg.disp <= 127 && reg.disp >= -128) 1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org reg.mod = mod_DISP8; 1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else 2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org reg.mod = mod_DISP32; 2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return reg; 2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct x86_reg x86_deref( struct x86_reg reg ) 2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return x86_make_disp(reg, 0); 2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct x86_reg x86_get_base_reg( struct x86_reg reg ) 2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return x86_make_reg( reg.file, reg.idx ); 2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgunsigned char *x86_get_label( struct x86_function *p ) 2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return p->csr; 2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*********************************************************************** 2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * x86 instructions 2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_jcc( struct x86_function *p, 2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org enum x86_cc cc, 2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char *label ) 2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org int offset = label - (x86_get_label(p) + 2); 2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (offset <= 127 && offset >= -128) { 2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x70 + cc); 2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1b(p, (char) offset); 2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org offset = label - (x86_get_label(p) + 6); 2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0x0f, 0x80 + cc); 2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1i(p, offset); 2413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Always use a 32bit offset for forward jumps: 2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgunsigned char *x86_jcc_forward( struct x86_function *p, 2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org enum x86_cc cc ) 2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0x0f, 0x80 + cc); 2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1i(p, 0); 2513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return x86_get_label(p); 2523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgunsigned char *x86_jmp_forward( struct x86_function *p) 2553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xe9); 2573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1i(p, 0); 2583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return x86_get_label(p); 2593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgunsigned char *x86_call_forward( struct x86_function *p) 2623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xe8); 2643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1i(p, 0); 2653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return x86_get_label(p); 2663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Fixup offset from forward jump: 2693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 2703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_fixup_fwd_jump( struct x86_function *p, 2713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char *fixup ) 2723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *(int *)(fixup - 4) = x86_get_label(p) - fixup; 2743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_jmp( struct x86_function *p, unsigned char *label) 2773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xe9); 2793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1i(p, label - x86_get_label(p) - 4); 2803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if 0 2833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* This doesn't work once we start reallocating & copying the 2843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * generated code on buffer fills, because the call is relative to the 2853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * current pc. 2863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 2873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_call( struct x86_function *p, void (*label)()) 2883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xe8); 2903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1i(p, cptr(label) - x86_get_label(p) - 4); 2913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#else 2933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_call( struct x86_function *p, struct x86_reg reg) 2943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xff); 2963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 2, reg); 2973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 2993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* michal: 3023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Temporary. As I need immediate operands, and dont want to mess with the codegen, 3033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * I load the immediate into general purpose register and use it. 3043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 3053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm ) 3063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.mod == mod_REG); 3083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xb8 + dst.idx); 3093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1i(p, imm); 3103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_push( struct x86_function *p, 3133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg reg ) 3143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(reg.mod == mod_REG); 3163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x50 + reg.idx); 3173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->stack_offset += 4; 3183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_pop( struct x86_function *p, 3213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg reg ) 3223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(reg.mod == mod_REG); 3243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x58 + reg.idx); 3253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->stack_offset -= 4; 3263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_inc( struct x86_function *p, 3293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg reg ) 3303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(reg.mod == mod_REG); 3323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x40 + reg.idx); 3333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_dec( struct x86_function *p, 3363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg reg ) 3373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(reg.mod == mod_REG); 3393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x48 + reg.idx); 3403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_ret( struct x86_function *p ) 3433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xc3); 3453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_sahf( struct x86_function *p ) 3483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x9e); 3503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_mov( struct x86_function *p, 3533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 3543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 3553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x8b, 0x89, dst, src ); 3573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_xor( struct x86_function *p, 3603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 3613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 3623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x33, 0x31, dst, src ); 3643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_cmp( struct x86_function *p, 3673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 3683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 3693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x3b, 0x39, dst, src ); 3713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_lea( struct x86_function *p, 3743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 3753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 3763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x8d); 3783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 3793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_test( struct x86_function *p, 3823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 3833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 3843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x85); 3863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 3873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_add( struct x86_function *p, 3903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 3913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 3923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm(p, 0x03, 0x01, dst, src ); 3943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 3953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 3963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_mul( struct x86_function *p, 3973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 3983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 3993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert (src.file == file_REG32 && src.mod == mod_REG); 4003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm(p, 0xf7, 0, x86_make_reg (file_REG32, reg_SP), src ); 4013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_sub( struct x86_function *p, 4043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm(p, 0x2b, 0x29, dst, src ); 4083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_or( struct x86_function *p, 4113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x0b, 0x09, dst, src ); 4153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_and( struct x86_function *p, 4183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x23, 0x21, dst, src ); 4223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*********************************************************************** 4273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SSE instructions 4283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 4293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_movss( struct x86_function *p, 4323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xF3, X86_TWOB); 4363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x10, 0x11, dst, src ); 4373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_movaps( struct x86_function *p, 4403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, X86_TWOB); 4443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x28, 0x29, dst, src ); 4453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_movups( struct x86_function *p, 4483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, X86_TWOB); 4523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x10, 0x11, dst, src ); 4533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_movhps( struct x86_function *p, 4563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.mod != mod_REG || src.mod != mod_REG); 4603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, X86_TWOB); 4613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x16, 0x17, dst, src ); /* cf movlhps */ 4623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_movlps( struct x86_function *p, 4653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.mod != mod_REG || src.mod != mod_REG); 4693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, X86_TWOB); 4703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x12, 0x13, dst, src ); /* cf movhlps */ 4713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_maxps( struct x86_function *p, 4743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x5F); 4783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 4793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_maxss( struct x86_function *p, 4823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x5F); 4863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 4873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_divss( struct x86_function *p, 4903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 4923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 4933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x5E); 4943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 4953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 4963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_minps( struct x86_function *p, 4983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 4993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x5D); 5023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_subps( struct x86_function *p, 5063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x5C); 5103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_mulps( struct x86_function *p, 5143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x59); 5183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_mulss( struct x86_function *p, 5223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x59); 5263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_addps( struct x86_function *p, 5303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x58); 5343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_addss( struct x86_function *p, 5383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x58); 5423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_andnps( struct x86_function *p, 5463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x55); 5503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_andps( struct x86_function *p, 5543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x54); 5583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_rsqrtps( struct x86_function *p, 5623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x52); 5663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_rsqrtss( struct x86_function *p, 5703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x52); 5743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_movhlps( struct x86_function *p, 5793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.mod == mod_REG && src.mod == mod_REG); 5833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x12); 5843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_movlhps( struct x86_function *p, 5883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 5913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.mod == mod_REG && src.mod == mod_REG); 5923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x16); 5933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 5943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 5953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_orps( struct x86_function *p, 5973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 5983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 5993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x56); 6013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 6023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_xorps( struct x86_function *p, 6053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 6063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 6073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x57); 6093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 6103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_cvtps2pi( struct x86_function *p, 6133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 6143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 6153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_MMX && 6173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (src.file == file_XMM || src.mod != mod_REG)); 6183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->need_emms = 1; 6203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x2d); 6223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 6233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Shufps can also be used to implement a reduced swizzle when dest == 6273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * arg0. 6283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 6293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_shufps( struct x86_function *p, 6303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dest, 6313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg arg0, 6323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char shuf) 6333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0xC6); 6353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm(p, dest, arg0); 6363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, shuf); 6373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_cmpps( struct x86_function *p, 6403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dest, 6413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg arg0, 6423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char cc) 6433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0xC2); 6453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm(p, dest, arg0); 6463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, cc); 6473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse_pmovmskb( struct x86_function *p, 6503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dest, 6513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src) 6523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0xD7); 6543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm(p, dest, src); 6553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*********************************************************************** 6583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SSE2 instructions 6593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 6603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 6623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Perform a reduced swizzle: 6633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 6643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse2_pshufd( struct x86_function *p, 6653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dest, 6663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg arg0, 6673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char shuf) 6683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x70); 6703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm(p, dest, arg0); 6713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, shuf); 6723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse2_cvttps2dq( struct x86_function *p, 6753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 6763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 6773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub( p, 0xF3, X86_TWOB, 0x5B ); 6793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 6803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse2_cvtps2dq( struct x86_function *p, 6833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 6843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 6853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x5B); 6873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 6883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse2_packssdw( struct x86_function *p, 6913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 6923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 6933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 6943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x6B); 6953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 6963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 6973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse2_packsswb( struct x86_function *p, 6993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 7003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 7013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x63); 7033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 7043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse2_packuswb( struct x86_function *p, 7073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 7083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 7093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x67); 7113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 7123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse2_rcpps( struct x86_function *p, 7153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 7163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 7173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x53); 7193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 7203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse2_rcpss( struct x86_function *p, 7233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 7243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 7253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x53); 7273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 7283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid sse2_movd( struct x86_function *p, 7313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 7323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 7333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0x66, X86_TWOB); 7353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x6e, 0x7e, dst, src ); 7363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*********************************************************************** 7423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * x87 instructions 7433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 7443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fist( struct x86_function *p, struct x86_reg dst ) 7453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xdb); 7473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 2, dst); 7483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fistp( struct x86_function *p, struct x86_reg dst ) 7513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xdb); 7533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 3, dst); 7543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fild( struct x86_function *p, struct x86_reg arg ) 7573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xdf); 7593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 0, arg); 7603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fldz( struct x86_function *p ) 7633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xee); 7653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fldcw( struct x86_function *p, struct x86_reg arg ) 7693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(arg.file == file_REG32); 7713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(arg.mod != mod_REG); 7723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xd9); 7733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 5, arg); 7743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fld1( struct x86_function *p ) 7773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xe8); 7793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fldl2e( struct x86_function *p ) 7823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xea); 7843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fldln2( struct x86_function *p ) 7873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xed); 7893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fwait( struct x86_function *p ) 7923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0x9b); 7943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 7953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fnclex( struct x86_function *p ) 7973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 7983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xdb, 0xe2); 7993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fclex( struct x86_function *p ) 8023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org x87_fwait(p); 8043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org x87_fnclex(p); 8053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void x87_arith_op( struct x86_function *p, struct x86_reg dst, struct x86_reg arg, 8093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char dst0ub0, 8103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char dst0ub1, 8113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char arg0ub0, 8123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char arg0ub1, 8133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned char argmem_noreg) 8143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_x87); 8163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (arg.file == file_x87) { 8183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (dst.idx == 0) 8193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, dst0ub0, dst0ub1+arg.idx); 8203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else if (arg.idx == 0) 8213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, arg0ub0, arg0ub1+arg.idx); 8223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else 8233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(0); 8243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 8253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else if (dst.idx == 0) { 8263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(arg.file == file_REG32); 8273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xd8); 8283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, argmem_noreg, arg); 8293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 8303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else 8313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(0); 8323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fmul( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org x87_arith_op(p, dst, arg, 8373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xd8, 0xc8, 8383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xdc, 0xc8, 8393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4); 8403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fsub( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org x87_arith_op(p, dst, arg, 8453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xd8, 0xe0, 8463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xdc, 0xe8, 8473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 4); 8483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fsubr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org x87_arith_op(p, dst, arg, 8533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xd8, 0xe8, 8543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xdc, 0xe0, 8553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 5); 8563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fadd( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org x87_arith_op(p, dst, arg, 8613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xd8, 0xc0, 8623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xdc, 0xc0, 8633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0); 8643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fdiv( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org x87_arith_op(p, dst, arg, 8693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xd8, 0xf0, 8703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xdc, 0xf8, 8713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 6); 8723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) 8753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org x87_arith_op(p, dst, arg, 8773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xd8, 0xf8, 8783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 0xdc, 0xf0, 8793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 7); 8803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fmulp( struct x86_function *p, struct x86_reg dst ) 8833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_x87); 8853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.idx >= 1); 8863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xde, 0xc8+dst.idx); 8873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fsubp( struct x86_function *p, struct x86_reg dst ) 8903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_x87); 8923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.idx >= 1); 8933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xde, 0xe8+dst.idx); 8943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 8953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 8963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fsubrp( struct x86_function *p, struct x86_reg dst ) 8973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 8983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_x87); 8993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.idx >= 1); 9003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xde, 0xe0+dst.idx); 9013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_faddp( struct x86_function *p, struct x86_reg dst ) 9043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_x87); 9063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.idx >= 1); 9073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xde, 0xc0+dst.idx); 9083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fdivp( struct x86_function *p, struct x86_reg dst ) 9113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_x87); 9133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.idx >= 1); 9143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xde, 0xf8+dst.idx); 9153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fdivrp( struct x86_function *p, struct x86_reg dst ) 9183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_x87); 9203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.idx >= 1); 9213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xde, 0xf0+dst.idx); 9223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fucom( struct x86_function *p, struct x86_reg arg ) 9253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(arg.file == file_x87); 9273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xdd, 0xe0+arg.idx); 9283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fucomp( struct x86_function *p, struct x86_reg arg ) 9313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(arg.file == file_x87); 9333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xdd, 0xe8+arg.idx); 9343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fucompp( struct x86_function *p ) 9373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xda, 0xe9); 9393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fxch( struct x86_function *p, struct x86_reg arg ) 9423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(arg.file == file_x87); 9443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xc8+arg.idx); 9453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fabs( struct x86_function *p ) 9483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xe1); 9503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fchs( struct x86_function *p ) 9533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xe0); 9553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fcos( struct x86_function *p ) 9583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xff); 9603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fprndint( struct x86_function *p ) 9643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xfc); 9663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fscale( struct x86_function *p ) 9693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xfd); 9713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fsin( struct x86_function *p ) 9743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xfe); 9763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fsincos( struct x86_function *p ) 9793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xfb); 9813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fsqrt( struct x86_function *p ) 9843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xfa); 9863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fxtract( struct x86_function *p ) 9893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xf4); 9913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 9923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 9933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* st0 = (2^st0)-1 9943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 9953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Restrictions: -1.0 <= st0 <= 1.0 9963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 9973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_f2xm1( struct x86_function *p ) 9983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 9993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xf0); 10003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* st1 = st1 * log2(st0); 10033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * pop_stack; 10043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 10053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fyl2x( struct x86_function *p ) 10063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 10073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xf1); 10083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* st1 = st1 * log2(st0 + 1.0); 10113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * pop_stack; 10123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 10133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * A fast operation, with restrictions: -.29 < st0 < .29 10143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 10153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fyl2xp1( struct x86_function *p ) 10163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 10173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xf9); 10183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fld( struct x86_function *p, struct x86_reg arg ) 10223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 10233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (arg.file == file_x87) 10243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd9, 0xc0 + arg.idx); 10253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 10263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xd9); 10273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 0, arg); 10283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 10293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fst( struct x86_function *p, struct x86_reg dst ) 10323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 10333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (dst.file == file_x87) 10343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xdd, 0xd0 + dst.idx); 10353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 10363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xd9); 10373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 2, dst); 10383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 10393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fstp( struct x86_function *p, struct x86_reg dst ) 10423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 10433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (dst.file == file_x87) 10443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xdd, 0xd8 + dst.idx); 10453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 10463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xd9); 10473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 3, dst); 10483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 10493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fcom( struct x86_function *p, struct x86_reg dst ) 10523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 10533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (dst.file == file_x87) 10543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd8, 0xd0 + dst.idx); 10553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 10563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xd8); 10573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 2, dst); 10583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 10593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fcomp( struct x86_function *p, struct x86_reg dst ) 10623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 10633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (dst.file == file_x87) 10643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xd8, 0xd8 + dst.idx); 10653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 10663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xd8); 10673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 3, dst); 10683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 10693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x87_fnstsw( struct x86_function *p, struct x86_reg dst ) 10733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 10743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_REG32); 10753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (dst.idx == reg_AX && 10773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org dst.mod == mod_REG) 10783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0xdf, 0xe0); 10793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 10803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, 0xdd); 10813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm_noreg(p, 7, dst); 10823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 10833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*********************************************************************** 10893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * MMX instructions 10903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 10913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid mmx_emms( struct x86_function *p ) 10933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 10943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(p->need_emms); 10953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, 0x0f, 0x77); 10963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->need_emms = 0; 10973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 10983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 10993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid mmx_packssdw( struct x86_function *p, 11003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 11013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 11023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_MMX && 11043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (src.file == file_MMX || src.mod != mod_REG)); 11053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->need_emms = 1; 11073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x6b); 11093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 11103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid mmx_packuswb( struct x86_function *p, 11133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 11143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 11153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(dst.file == file_MMX && 11173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (src.file == file_MMX || src.mod != mod_REG)); 11183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->need_emms = 1; 11203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_2ub(p, X86_TWOB, 0x67); 11223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_modrm( p, dst, src ); 11233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid mmx_movd( struct x86_function *p, 11263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 11273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 11283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->need_emms = 1; 11303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, X86_TWOB); 11313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x6e, 0x7e, dst, src ); 11323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid mmx_movq( struct x86_function *p, 11353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg dst, 11363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct x86_reg src ) 11373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->need_emms = 1; 11393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_1ub(p, X86_TWOB); 11403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org emit_op_modrm( p, 0x6f, 0x7f, dst, src ); 11413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*********************************************************************** 11453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Helper functions 11463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 11473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Retreive a reference to one of the function arguments, taking into 11503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * account any push/pop activity: 11513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 11523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct x86_reg x86_fn_arg( struct x86_function *p, 11533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned arg ) 11543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return x86_make_disp(x86_make_reg(file_REG32, reg_SP), 11563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->stack_offset + arg * 4); /* ??? */ 11573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_init_func( struct x86_function *p ) 11613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->size = 0; 11633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->store = NULL; 11643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->csr = p->store; 11653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgint x86_init_func_size( struct x86_function *p, unsigned code_size ) 11683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->size = code_size; 11703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->store = _mesa_exec_malloc(code_size); 11713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->csr = p->store; 11723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return p->store != NULL; 11733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86_release_func( struct x86_function *p ) 11763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org _mesa_exec_free(p->store); 11783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->store = NULL; 11793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->csr = NULL; 11803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org p->size = 0; 11813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid (*x86_get_func( struct x86_function *p ))(void) 11853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (DISASSEM && p->store) 1187760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org printf("disassemble %p %p\n", p->store, p->csr); 11883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return (void (*)(void)) (unsigned long) p->store; 11893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#else 11923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid x86sse_dummy( void ) 11943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 11953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 11963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 11983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 11993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#else /* USE_X86_ASM */ 12003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 12013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgint x86sse_c_dummy_var; /* silence warning */ 12023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 12033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif /* USE_X86_ASM */ 1204