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