1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_config.h"
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_cpu_detect.h"
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(PIPE_ARCH_X86) || (defined(PIPE_ARCH_X86_64) && !defined(__MINGW32__))
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pointer.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "rtasm_execmem.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "rtasm_x86sse.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DISASSEM 0
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define X86_TWOB 0x0f
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_SSE  0
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_print_reg( struct x86_reg reg )
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (reg.mod != mod_REG)
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf( "[" );
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch( reg.file ) {
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case file_REG32:
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch( reg.idx ) {
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case reg_AX: debug_printf( "EAX" ); break;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case reg_CX: debug_printf( "ECX" ); break;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case reg_DX: debug_printf( "EDX" ); break;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case reg_BX: debug_printf( "EBX" ); break;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case reg_SP: debug_printf( "ESP" ); break;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case reg_BP: debug_printf( "EBP" ); break;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case reg_SI: debug_printf( "ESI" ); break;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case reg_DI: debug_printf( "EDI" ); break;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case file_MMX:
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf( "MMX%u", reg.idx );
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case file_XMM:
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf( "XMM%u", reg.idx );
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case file_x87:
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf( "fp%u", reg.idx );
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (reg.mod == mod_DISP8 ||
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       reg.mod == mod_DISP32)
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf("+%d", reg.disp);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (reg.mod != mod_REG)
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf( "]" );
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DUMP_SSE
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_START() debug_printf( "\n" )
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_END() debug_printf( "\n" )
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP() do {                             \
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *foo = __FUNCTION__;              \
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (*foo && *foo != '_')                  \
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      foo++;                                    \
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if  (*foo)                                   \
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      foo++;                                    \
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf( "\n%4x %14s ", p->csr - p->store, foo );             \
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_I( I ) do {                        \
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();                                      \
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf( "%u", I );                     \
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 )
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_R( R0 ) do {                       \
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();                                      \
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_print_reg( R0 );                            \
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 )
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RR( R0, R1 ) do {                  \
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();                                      \
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_print_reg( R0 );                            \
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf( ", " );                        \
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_print_reg( R1 );                            \
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 )
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RI( R0, I ) do {                   \
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();                                      \
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_print_reg( R0 );                            \
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf( ", %u", I );                   \
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 )
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RRI( R0, R1, I ) do {              \
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();                                      \
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_print_reg( R0 );                            \
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf( ", " );                        \
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_print_reg( R1 );                            \
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf( ", %u", I );                   \
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 )
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_START()
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_END()
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP( )
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_I( I )
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_R( R0 )
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RR( R0, R1 )
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RI( R0, I )
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RRI( R0, R1, I )
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void do_realloc( struct x86_function *p )
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (p->store == p->error_overflow) {
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->csr = p->store;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (p->size == 0) {
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->size = 1024;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->store = rtasm_exec_malloc(p->size);
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->csr = p->store;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uintptr_t used = pointer_to_uintptr( p->csr ) - pointer_to_uintptr( p->store );
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char *tmp = p->store;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->size *= 2;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->store = rtasm_exec_malloc(p->size);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (p->store) {
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memcpy(p->store, tmp, used);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         p->csr = p->store + used;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         p->csr = p->store;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rtasm_exec_free(tmp);
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (p->store == NULL) {
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->store = p->csr = p->error_overflow;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->size = sizeof(p->error_overflow);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Emit bytes to the instruction stream:
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned char *reserve( struct x86_function *p, int bytes )
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (p->csr + bytes - p->store > (int) p->size)
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      do_realloc(p);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char *csr = p->csr;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->csr += bytes;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return csr;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_1b( struct x86_function *p, char b0 )
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *csr = (char *)reserve(p, 1);
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *csr = b0;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_1i( struct x86_function *p, int i0 )
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int *icsr = (int *)reserve(p, sizeof(i0));
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *icsr = i0;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_1ub( struct x86_function *p, unsigned char b0 )
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned char *csr = reserve(p, 1);
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *csr++ = b0;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_2ub( struct x86_function *p, unsigned char b0, unsigned char b1 )
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned char *csr = reserve(p, 2);
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *csr++ = b0;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *csr++ = b1;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_3ub( struct x86_function *p, unsigned char b0, unsigned char b1, unsigned char b2 )
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned char *csr = reserve(p, 3);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *csr++ = b0;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *csr++ = b1;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *csr++ = b2;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Build a modRM byte + possible displacement.  No treatment of SIB
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * indexing.  BZZT - no way to encode an absolute address.
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the "/r" field in the x86 manuals...
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_modrm( struct x86_function *p,
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct x86_reg reg,
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct x86_reg regmem )
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned char val = 0;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(reg.mod == mod_REG);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* TODO: support extended x86-64 registers */
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(reg.idx < 8);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(regmem.idx < 8);
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   val |= regmem.mod << 6;     	/* mod field */
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   val |= reg.idx << 3;		/* reg field */
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   val |= regmem.idx;		/* r/m field */
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, val);
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Oh-oh we've stumbled into the SIB thing.
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (regmem.file == file_REG32 &&
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       regmem.idx == reg_SP &&
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       regmem.mod != mod_REG) {
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0x24);		/* simplistic! */
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (regmem.mod) {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_REG:
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_INDIRECT:
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_DISP8:
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1b(p, (char) regmem.disp);
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_DISP32:
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1i(p, regmem.disp);
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Emits the "/0".."/7" specialized versions of the modrm ("/r") bytes.
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_modrm_noreg( struct x86_function *p,
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      unsigned op,
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      struct x86_reg regmem )
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct x86_reg dummy = x86_make_reg(file_REG32, op);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dummy, regmem);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Many x86 instructions have two opcodes to cope with the situations
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * where the destination is a register or memory reference
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * respectively.  This function selects the correct opcode based on
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the arguments presented.
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_op_modrm( struct x86_function *p,
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   unsigned char op_dst_is_reg,
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   unsigned char op_dst_is_mem,
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   struct x86_reg dst,
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   struct x86_reg src )
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dst.mod) {
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_REG:
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, op_dst_is_reg);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm(p, dst, src);
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_INDIRECT:
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_DISP32:
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_DISP8:
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(src.mod == mod_REG);
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, op_dst_is_mem);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm(p, src, dst);
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Create and manipulate registers and regmem values:
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_make_reg( enum x86_reg_file file,
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     enum x86_reg_name idx )
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct x86_reg reg;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   reg.file = file;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   reg.idx = idx;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   reg.mod = mod_REG;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   reg.disp = 0;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return reg;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_make_disp( struct x86_reg reg,
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      int disp )
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(reg.file == file_REG32);
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (reg.mod == mod_REG)
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reg.disp = disp;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reg.disp += disp;
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (reg.disp == 0 && reg.idx != reg_BP)
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reg.mod = mod_INDIRECT;
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (reg.disp <= 127 && reg.disp >= -128)
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reg.mod = mod_DISP8;
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reg.mod = mod_DISP32;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return reg;
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_deref( struct x86_reg reg )
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return x86_make_disp(reg, 0);
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_get_base_reg( struct x86_reg reg )
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return x86_make_reg( reg.file, reg.idx );
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint x86_get_label( struct x86_function *p )
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return p->csr - p->store;
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * x86 instructions
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x64_rexw(struct x86_function *p)
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(x86_target(p) != X86_32)
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0x48);
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_jcc( struct x86_function *p,
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      enum x86_cc cc,
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      int label )
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int offset = label - (x86_get_label(p) + 2);
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_I(cc);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (offset < 0) {
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*assert(p->csr - p->store > -offset);*/
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (p->csr - p->store <= -offset) {
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* probably out of memory (using the error_overflow buffer) */
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (offset <= 127 && offset >= -128) {
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0x70 + cc);
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1b(p, (char) offset);
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      offset = label - (x86_get_label(p) + 6);
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_2ub(p, 0x0f, 0x80 + cc);
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1i(p, offset);
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Always use a 32bit offset for forward jumps:
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint x86_jcc_forward( struct x86_function *p,
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     enum x86_cc cc )
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_I(cc);
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x0f, 0x80 + cc);
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1i(p, 0);
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return x86_get_label(p);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint x86_jmp_forward( struct x86_function *p)
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xe9);
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1i(p, 0);
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return x86_get_label(p);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint x86_call_forward( struct x86_function *p)
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xe8);
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1i(p, 0);
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return x86_get_label(p);
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Fixup offset from forward jump:
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_fixup_fwd_jump( struct x86_function *p,
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 int fixup )
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *(int *)(p->store + fixup - 4) = x86_get_label(p) - fixup;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_jmp( struct x86_function *p, int label)
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_I( label );
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xe9);
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1i(p, label - x86_get_label(p) - 4);
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_call( struct x86_function *p, struct x86_reg reg)
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( reg );
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xff);
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 2, reg);
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm )
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_REG32);
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.mod == mod_REG);
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xb8 + dst.idx);
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1i(p, imm);
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov_imm( struct x86_function *p, struct x86_reg dst, int imm )
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(dst.mod == mod_REG)
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      x86_mov_reg_imm(p, dst, imm);
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xc7);
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 0, dst);
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1i(p, imm);
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov16_imm( struct x86_function *p, struct x86_reg dst, uint16_t imm )
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0x66);
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(dst.mod == mod_REG)
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xb8 + dst.idx);
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_2ub(p, imm & 0xff, imm >> 8);
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xc7);
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 0, dst);
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_2ub(p, imm & 0xff, imm >> 8);
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov8_imm( struct x86_function *p, struct x86_reg dst, uint8_t imm )
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(dst.mod == mod_REG)
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xb0 + dst.idx);
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, imm);
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xc6);
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 0, dst);
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, imm);
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Immediate group 1 instructions.
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx86_group1_imm( struct x86_function *p,
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                unsigned op, struct x86_reg dst, int imm )
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_REG32);
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.mod == mod_REG);
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(-0x80 <= imm && imm < 0x80) {
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0x83);
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, op, dst);
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1b(p, (char)imm);
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0x81);
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, op, dst);
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1i(p, imm);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_add_imm( struct x86_function *p, struct x86_reg dst, int imm )
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_group1_imm(p, 0, dst, imm);
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_or_imm( struct x86_function *p, struct x86_reg dst, int imm )
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_group1_imm(p, 1, dst, imm);
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_and_imm( struct x86_function *p, struct x86_reg dst, int imm )
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_group1_imm(p, 4, dst, imm);
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_sub_imm( struct x86_function *p, struct x86_reg dst, int imm )
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_group1_imm(p, 5, dst, imm);
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_xor_imm( struct x86_function *p, struct x86_reg dst, int imm )
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_group1_imm(p, 6, dst, imm);
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cmp_imm( struct x86_function *p, struct x86_reg dst, int imm )
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI( dst, imm );
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_group1_imm(p, 7, dst, imm);
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_push( struct x86_function *p,
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg reg )
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( reg );
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (reg.mod == mod_REG)
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0x50 + reg.idx);
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xff);
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 6, reg);
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->stack_offset += sizeof(void*);
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_push_imm32( struct x86_function *p,
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     int imm32 )
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_I( imm32 );
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0x68);
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1i(p,  imm32);
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->stack_offset += sizeof(void*);
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_pop( struct x86_function *p,
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg reg )
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( reg );
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(reg.mod == mod_REG);
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0x58 + reg.idx);
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->stack_offset -= sizeof(void*);
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_inc( struct x86_function *p,
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg reg )
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( reg );
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(x86_target(p) == X86_32 && reg.mod == mod_REG)
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0x40 + reg.idx);
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xff);
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 0, reg);
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_dec( struct x86_function *p,
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg reg )
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( reg );
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(x86_target(p) == X86_32 && reg.mod == mod_REG)
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0x48 + reg.idx);
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xff);
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 1, reg);
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_ret( struct x86_function *p )
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(p->stack_offset == 0);
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xc3);
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_retw( struct x86_function *p, unsigned short imm )
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xc2, imm & 0xff, (imm >> 8) & 0xff);
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_sahf( struct x86_function *p )
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0x9e);
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov( struct x86_function *p,
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg dst,
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg src )
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* special hack for reading arguments until we support x86-64 registers everywhere */
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(src.mod == mod_REG && dst.mod == mod_REG && (src.idx >= 8 || dst.idx >= 8))
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t rex = 0x40;
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(dst.idx >= 8)
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rex |= 4;
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst.idx -= 8;
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(src.idx >= 8)
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rex |= 1;
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src.idx -= 8;
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, rex);
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x8b, 0x89, dst, src );
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov16( struct x86_function *p,
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg dst,
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg src )
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0x66);
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x8b, 0x89, dst, src );
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov8( struct x86_function *p,
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg dst,
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg src )
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x8a, 0x88, dst, src );
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x64_mov64( struct x86_function *p,
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg dst,
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg src )
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t rex = 0x48;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(x86_target(p) != X86_32);
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* special hack for reading arguments until we support x86-64 registers everywhere */
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(src.mod == mod_REG && dst.mod == mod_REG && (src.idx >= 8 || dst.idx >= 8))
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(dst.idx >= 8)
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rex |= 4;
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst.idx -= 8;
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(src.idx >= 8)
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rex |= 1;
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src.idx -= 8;
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, rex);
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x8b, 0x89, dst, src );
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_movzx8(struct x86_function *p, struct x86_reg dst, struct x86_reg src )
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x0f, 0xb6);
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_movzx16(struct x86_function *p, struct x86_reg dst, struct x86_reg src )
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x0f, 0xb7);
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cmovcc( struct x86_function *p,
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct x86_reg dst,
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct x86_reg src,
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 enum x86_cc cc)
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RRI( dst, src, cc );
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub( p, 0x0f, 0x40 + cc );
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_xor( struct x86_function *p,
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg dst,
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg src )
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x33, 0x31, dst, src );
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cmp( struct x86_function *p,
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg dst,
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg src )
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x3b, 0x39, dst, src );
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_lea( struct x86_function *p,
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg dst,
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      struct x86_reg src )
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0x8d);
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_test( struct x86_function *p,
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg dst,
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg src )
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0x85);
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_add( struct x86_function *p,
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg dst,
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg src )
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm(p, 0x03, 0x01, dst, src );
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Calculate EAX * src, results in EDX:EAX.
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mul( struct x86_function *p,
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg src )
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R(  src );
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xf7);
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 4, src );
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_imul( struct x86_function *p,
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg dst,
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg src )
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0xAF);
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_sub( struct x86_function *p,
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg dst,
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg src )
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm(p, 0x2b, 0x29, dst, src );
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_or( struct x86_function *p,
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct x86_reg dst,
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct x86_reg src )
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x0b, 0x09, dst, src );
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_and( struct x86_function *p,
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct x86_reg dst,
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct x86_reg src )
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x23, 0x21, dst, src );
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_div( struct x86_function *p,
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct x86_reg src )
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(src.file == file_REG32 && src.mod == mod_REG);
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm(p, 0xf7, 0, x86_make_reg(file_REG32, 6), src);
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_bswap( struct x86_function *p, struct x86_reg reg )
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R(reg);
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(reg.file == file_REG32);
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(reg.mod == mod_REG);
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x0f, 0xc8 + reg.idx);
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_shr_imm( struct x86_function *p, struct x86_reg reg, unsigned imm )
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(reg, imm);
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(imm == 1)
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xd1);
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 5, reg);
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xc1);
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 5, reg);
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, imm);
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_sar_imm( struct x86_function *p, struct x86_reg reg, unsigned imm )
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(reg, imm);
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(imm == 1)
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xd1);
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 7, reg);
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xc1);
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 7, reg);
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, imm);
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_shl_imm( struct x86_function *p, struct x86_reg reg, unsigned imm  )
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(reg, imm);
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(imm == 1)
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xd1);
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 4, reg);
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xc1);
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 4, reg);
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, imm);
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SSE instructions
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_prefetchnta( struct x86_function *p, struct x86_reg ptr)
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( ptr );
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(ptr.mod != mod_REG);
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x0f, 0x18);
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 0, ptr);
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_prefetch0( struct x86_function *p, struct x86_reg ptr)
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( ptr );
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(ptr.mod != mod_REG);
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x0f, 0x18);
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 1, ptr);
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_prefetch1( struct x86_function *p, struct x86_reg ptr)
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( ptr );
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(ptr.mod != mod_REG);
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x0f, 0x18);
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 2, ptr);
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movntps( struct x86_function *p,
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct x86_reg dst,
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct x86_reg src)
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.mod != mod_REG);
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(src.mod == mod_REG);
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x0f, 0x2b);
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, src, dst);
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movss( struct x86_function *p,
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xF3, X86_TWOB);
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x10, 0x11, dst, src );
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movaps( struct x86_function *p,
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg dst,
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg src )
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, X86_TWOB);
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x28, 0x29, dst, src );
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movups( struct x86_function *p,
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg dst,
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg src )
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, X86_TWOB);
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x10, 0x11, dst, src );
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movhps( struct x86_function *p,
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg dst,
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg src )
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.mod != mod_REG || src.mod != mod_REG);
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, X86_TWOB);
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x16, 0x17, dst, src ); /* cf movlhps */
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movlps( struct x86_function *p,
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg dst,
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg src )
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.mod != mod_REG || src.mod != mod_REG);
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, X86_TWOB);
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x12, 0x13, dst, src ); /* cf movhlps */
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_maxps( struct x86_function *p,
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x5F);
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_maxss( struct x86_function *p,
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xF3, X86_TWOB, 0x5F);
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_divss( struct x86_function *p,
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xF3, X86_TWOB, 0x5E);
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_minps( struct x86_function *p,
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x5D);
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_subps( struct x86_function *p,
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x5C);
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_mulps( struct x86_function *p,
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x59);
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_mulss( struct x86_function *p,
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xF3, X86_TWOB, 0x59);
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_addps( struct x86_function *p,
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x58);
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_addss( struct x86_function *p,
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xF3, X86_TWOB, 0x58);
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_andnps( struct x86_function *p,
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct x86_reg dst,
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct x86_reg src )
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x55);
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_andps( struct x86_function *p,
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x54);
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_rsqrtps( struct x86_function *p,
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct x86_reg dst,
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct x86_reg src )
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x52);
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_rsqrtss( struct x86_function *p,
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  struct x86_reg dst,
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  struct x86_reg src )
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xF3, X86_TWOB, 0x52);
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movhlps( struct x86_function *p,
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  struct x86_reg dst,
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  struct x86_reg src )
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.mod == mod_REG && src.mod == mod_REG);
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x12);
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movlhps( struct x86_function *p,
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  struct x86_reg dst,
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  struct x86_reg src )
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.mod == mod_REG && src.mod == mod_REG);
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x16);
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_orps( struct x86_function *p,
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct x86_reg dst,
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct x86_reg src )
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x56);
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_xorps( struct x86_function *p,
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct x86_reg dst,
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct x86_reg src )
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x57);
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_cvtps2pi( struct x86_function *p,
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   struct x86_reg dst,
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   struct x86_reg src )
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_MMX &&
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (src.file == file_XMM || src.mod != mod_REG));
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->need_emms = 1;
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x2d);
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvtdq2ps( struct x86_function *p,
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   struct x86_reg dst,
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   struct x86_reg src )
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x5b);
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Shufps can also be used to implement a reduced swizzle when dest ==
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * arg0.
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_shufps( struct x86_function *p,
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg dst,
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 struct x86_reg src,
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 unsigned char shuf)
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RRI( dst, src, shuf );
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0xC6);
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, shuf);
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_unpckhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub( p, X86_TWOB, 0x15 );
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_unpcklps( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub( p, X86_TWOB, 0x14 );
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_cmpps( struct x86_function *p,
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src,
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		enum sse_cc cc)
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RRI( dst, src, cc );
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0xC2);
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, cc);
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_pmovmskb( struct x86_function *p,
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct x86_reg dst,
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct x86_reg src)
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, X86_TWOB, 0xD7);
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movmskps( struct x86_function *p,
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct x86_reg dst,
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct x86_reg src)
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x50);
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SSE2 instructions
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movd( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR(dst, src);
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x66, 0x0f);
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(dst.mod == mod_REG && dst.file == file_REG32)
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0x7e);
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm(p, src, dst);
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_op_modrm(p, 0x6e, 0x7e, dst, src);
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movq( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR(dst, src);
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dst.mod) {
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_REG:
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_3ub(p, 0xf3, 0x0f, 0x7e);
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm(p, dst, src);
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_INDIRECT:
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_DISP32:
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case mod_DISP8:
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(src.mod == mod_REG);
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_3ub(p, 0x66, 0x0f, 0xd6);
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm(p, src, dst);
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movdqu( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR(dst, src);
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xf3, 0x0f);
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm(p, 0x6f, 0x7f, dst, src);
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movdqa( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR(dst, src);
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x66, 0x0f);
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm(p, 0x6f, 0x7f, dst, src);
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movsd( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR(dst, src);
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xf2, 0x0f);
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm(p, 0x10, 0x11, dst, src);
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movupd( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR(dst, src);
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x66, 0x0f);
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm(p, 0x10, 0x11, dst, src);
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movapd( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR(dst, src);
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x66, 0x0f);
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm(p, 0x28, 0x29, dst, src);
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Perform a reduced swizzle:
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_pshufd( struct x86_function *p,
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  struct x86_reg dst,
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  struct x86_reg src,
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  unsigned char shuf)
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RRI( dst, src, shuf );
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, X86_TWOB, 0x70);
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, shuf);
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_pshuflw( struct x86_function *p,
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct x86_reg dst,
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct x86_reg src,
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  unsigned char shuf)
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RRI( dst, src, shuf );
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xf2, X86_TWOB, 0x70);
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, shuf);
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_pshufhw( struct x86_function *p,
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct x86_reg dst,
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct x86_reg src,
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  unsigned char shuf)
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RRI( dst, src, shuf );
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xf3, X86_TWOB, 0x70);
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, shuf);
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvttps2dq( struct x86_function *p,
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct x86_reg dst,
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct x86_reg src )
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub( p, 0xF3, X86_TWOB, 0x5B );
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvtps2dq( struct x86_function *p,
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg dst,
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg src )
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, X86_TWOB, 0x5B);
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvtsd2ss( struct x86_function *p,
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    struct x86_reg dst,
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    struct x86_reg src )
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xf2, 0x0f, 0x5a);
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvtpd2ps( struct x86_function *p,
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    struct x86_reg dst,
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    struct x86_reg src )
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x5a);
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_packssdw( struct x86_function *p,
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg dst,
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg src )
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, X86_TWOB, 0x6B);
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_packsswb( struct x86_function *p,
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg dst,
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg src )
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, X86_TWOB, 0x63);
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_packuswb( struct x86_function *p,
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg dst,
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg src )
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, X86_TWOB, 0x67);
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_punpcklbw( struct x86_function *p,
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg dst,
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct x86_reg src )
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, X86_TWOB, 0x60);
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_punpcklwd( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x61);
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_punpckldq( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x62);
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_punpcklqdq( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x6c);
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psllw_imm( struct x86_function *p, struct x86_reg dst, unsigned imm )
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(dst, imm);
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x71);
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 6, dst);
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, imm);
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_pslld_imm( struct x86_function *p, struct x86_reg dst, unsigned imm )
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(dst, imm);
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x72);
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 6, dst);
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, imm);
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psllq_imm( struct x86_function *p, struct x86_reg dst, unsigned imm )
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(dst, imm);
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x73);
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 6, dst);
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, imm);
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psrlw_imm( struct x86_function *p, struct x86_reg dst, unsigned imm )
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(dst, imm);
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x71);
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 2, dst);
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, imm);
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psrld_imm( struct x86_function *p, struct x86_reg dst, unsigned imm )
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(dst, imm);
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x72);
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 2, dst);
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, imm);
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psrlq_imm( struct x86_function *p, struct x86_reg dst, unsigned imm )
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(dst, imm);
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x73);
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 2, dst);
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, imm);
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psraw_imm( struct x86_function *p, struct x86_reg dst, unsigned imm )
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(dst, imm);
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x71);
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 4, dst);
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, imm);
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psrad_imm( struct x86_function *p, struct x86_reg dst, unsigned imm )
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RI(dst, imm);
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0x72);
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 4, dst);
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, imm);
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_por( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR(dst, src);
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0x66, 0x0f, 0xeb);
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm(p, dst, src);
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_rcpps( struct x86_function *p,
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct x86_reg dst,
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct x86_reg src )
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x53);
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_rcpss( struct x86_function *p,
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg dst,
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct x86_reg src )
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_3ub(p, 0xF3, X86_TWOB, 0x53);
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * x87 instructions
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void note_x87_pop( struct x86_function *p )
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->x87_stack--;
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(p->x87_stack >= 0);
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void note_x87_push( struct x86_function *p )
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->x87_stack++;
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(p->x87_stack <= 7);
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_assert_stack_empty( struct x86_function *p )
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert (p->x87_stack == 0);
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fist( struct x86_function *p, struct x86_reg dst )
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xdb);
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 2, dst);
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fistp( struct x86_function *p, struct x86_reg dst )
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xdb);
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 3, dst);
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fild( struct x86_function *p, struct x86_reg arg )
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xdf);
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 0, arg);
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_push(p);
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fldz( struct x86_function *p )
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xee);
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_push(p);
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fldcw( struct x86_function *p, struct x86_reg arg )
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_REG32);
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.mod != mod_REG);
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xd9);
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 5, arg);
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fld1( struct x86_function *p )
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xe8);
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_push(p);
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fldl2e( struct x86_function *p )
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xea);
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_push(p);
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fldln2( struct x86_function *p )
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xed);
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_push(p);
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fwait( struct x86_function *p )
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0x9b);
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fnclex( struct x86_function *p )
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xdb, 0xe2);
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fclex( struct x86_function *p )
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x87_fwait(p);
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x87_fnclex(p);
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovb( struct x86_function *p, struct x86_reg arg )
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_x87);
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xda, 0xc0+arg.idx);
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmove( struct x86_function *p, struct x86_reg arg )
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_x87);
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xda, 0xc8+arg.idx);
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovbe( struct x86_function *p, struct x86_reg arg )
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_x87);
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xda, 0xd0+arg.idx);
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovnb( struct x86_function *p, struct x86_reg arg )
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_x87);
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xdb, 0xc0+arg.idx);
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovne( struct x86_function *p, struct x86_reg arg )
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_x87);
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xdb, 0xc8+arg.idx);
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovnbe( struct x86_function *p, struct x86_reg arg )
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_x87);
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xdb, 0xd0+arg.idx);
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void x87_arith_op( struct x86_function *p, struct x86_reg dst, struct x86_reg arg,
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  unsigned char dst0ub0,
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  unsigned char dst0ub1,
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  unsigned char arg0ub0,
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  unsigned char arg0ub1,
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  unsigned char argmem_noreg)
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_x87);
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (arg.file == file_x87) {
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dst.idx == 0)
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 emit_2ub(p, dst0ub0, dst0ub1+arg.idx);
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (arg.idx == 0)
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 emit_2ub(p, arg0ub0, arg0ub1+arg.idx);
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 assert(0);
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (dst.idx == 0) {
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(arg.file == file_REG32);
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xd8);
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, argmem_noreg, arg);
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fmul( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x87_arith_op(p, dst, src,
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xd8, 0xc8,
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xdc, 0xc8,
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		4);
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsub( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x87_arith_op(p, dst, src,
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xd8, 0xe0,
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xdc, 0xe8,
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		4);
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsubr( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x87_arith_op(p, dst, src,
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xd8, 0xe8,
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xdc, 0xe0,
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		5);
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fadd( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x87_arith_op(p, dst, src,
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xd8, 0xc0,
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xdc, 0xc0,
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0);
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fdiv( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x87_arith_op(p, dst, src,
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xd8, 0xf0,
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xdc, 0xf8,
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		6);
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x87_arith_op(p, dst, src,
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xd8, 0xf8,
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		0xdc, 0xf0,
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		7);
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fmulp( struct x86_function *p, struct x86_reg dst )
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_x87);
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.idx >= 1);
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xde, 0xc8+dst.idx);
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsubp( struct x86_function *p, struct x86_reg dst )
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_x87);
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.idx >= 1);
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xde, 0xe8+dst.idx);
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsubrp( struct x86_function *p, struct x86_reg dst )
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_x87);
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.idx >= 1);
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xde, 0xe0+dst.idx);
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_faddp( struct x86_function *p, struct x86_reg dst )
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_x87);
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.idx >= 1);
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xde, 0xc0+dst.idx);
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fdivp( struct x86_function *p, struct x86_reg dst )
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_x87);
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.idx >= 1);
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xde, 0xf8+dst.idx);
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fdivrp( struct x86_function *p, struct x86_reg dst )
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_x87);
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.idx >= 1);
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xde, 0xf0+dst.idx);
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_ftst( struct x86_function *p )
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xe4);
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fucom( struct x86_function *p, struct x86_reg arg )
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_x87);
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xdd, 0xe0+arg.idx);
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fucomp( struct x86_function *p, struct x86_reg arg )
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_x87);
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xdd, 0xe8+arg.idx);
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fucompp( struct x86_function *p )
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xda, 0xe9);
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);             /* pop twice */
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);             /* pop twice */
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fxch( struct x86_function *p, struct x86_reg arg )
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(arg.file == file_x87);
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xc8+arg.idx);
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fabs( struct x86_function *p )
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xe1);
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fchs( struct x86_function *p )
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xe0);
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcos( struct x86_function *p )
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xff);
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fprndint( struct x86_function *p )
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xfc);
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fscale( struct x86_function *p )
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xfd);
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsin( struct x86_function *p )
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xfe);
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsincos( struct x86_function *p )
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xfb);
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsqrt( struct x86_function *p )
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xfa);
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fxtract( struct x86_function *p )
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xf4);
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* st0 = (2^st0)-1
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Restrictions: -1.0 <= st0 <= 1.0
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_f2xm1( struct x86_function *p )
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xf0);
1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* st1 = st1 * log2(st0);
1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pop_stack;
1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fyl2x( struct x86_function *p )
1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xf1);
1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* st1 = st1 * log2(st0 + 1.0);
1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pop_stack;
1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A fast operation, with restrictions: -.29 < st0 < .29
1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fyl2xp1( struct x86_function *p )
1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xd9, 0xf9);
1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fld( struct x86_function *p, struct x86_reg arg )
1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (arg.file == file_x87)
1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_2ub(p, 0xd9, 0xc0 + arg.idx);
1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xd9);
1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 0, arg);
1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_push(p);
1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fst( struct x86_function *p, struct x86_reg dst )
1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dst.file == file_x87)
1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_2ub(p, 0xdd, 0xd0 + dst.idx);
1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xd9);
1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 2, dst);
1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fstp( struct x86_function *p, struct x86_reg dst )
1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dst.file == file_x87)
1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_2ub(p, 0xdd, 0xd8 + dst.idx);
1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xd9);
1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 3, dst);
1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fpop( struct x86_function *p )
1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x87_fstp( p, x86_make_reg( file_x87, 0 ));
1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcom( struct x86_function *p, struct x86_reg dst )
1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dst.file == file_x87)
1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_2ub(p, 0xd8, 0xd0 + dst.idx);
1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xd8);
1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 2, dst);
1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcomp( struct x86_function *p, struct x86_reg dst )
1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dst.file == file_x87)
1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_2ub(p, 0xd8, 0xd8 + dst.idx);
1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xd8);
1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 3, dst);
1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcomi( struct x86_function *p, struct x86_reg arg )
1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xdb, 0xf0+arg.idx);
1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcomip( struct x86_function *p, struct x86_reg arg )
1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( arg );
1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0xdb, 0xf0+arg.idx);
1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   note_x87_pop(p);
1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fnstsw( struct x86_function *p, struct x86_reg dst )
1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_REG32);
1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dst.idx == reg_AX &&
1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dst.mod == mod_REG)
1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_2ub(p, 0xdf, 0xe0);
1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_1ub(p, 0xdd);
2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit_modrm_noreg(p, 7, dst);
2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fnstcw( struct x86_function *p, struct x86_reg dst )
2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_R( dst );
2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_REG32);
2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0x9b);           /* WAIT -- needed? */
2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, 0xd9);
2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm_noreg(p, 7, dst);
2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MMX instructions
2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_emms( struct x86_function *p )
2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP();
2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(p->need_emms);
2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, 0x0f, 0x77);
2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->need_emms = 0;
2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_packssdw( struct x86_function *p,
2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   struct x86_reg dst,
2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   struct x86_reg src )
2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_MMX &&
2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (src.file == file_MMX || src.mod != mod_REG));
2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->need_emms = 1;
2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x6b);
2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_packuswb( struct x86_function *p,
2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   struct x86_reg dst,
2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   struct x86_reg src )
2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dst.file == file_MMX &&
2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (src.file == file_MMX || src.mod != mod_REG));
2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->need_emms = 1;
2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_2ub(p, X86_TWOB, 0x67);
2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_modrm( p, dst, src );
2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_movd( struct x86_function *p,
2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg dst,
2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg src )
2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->need_emms = 1;
2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, X86_TWOB);
2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x6e, 0x7e, dst, src );
2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_movq( struct x86_function *p,
2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg dst,
2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       struct x86_reg src )
2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_RR( dst, src );
2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->need_emms = 1;
2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_1ub(p, X86_TWOB);
2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit_op_modrm( p, 0x6f, 0x7f, dst, src );
2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper functions
2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cdecl_caller_push_regs( struct x86_function *p )
2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_push(p, x86_make_reg(file_REG32, reg_AX));
2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_push(p, x86_make_reg(file_REG32, reg_CX));
2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_push(p, x86_make_reg(file_REG32, reg_DX));
2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cdecl_caller_pop_regs( struct x86_function *p )
2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_pop(p, x86_make_reg(file_REG32, reg_DX));
2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_pop(p, x86_make_reg(file_REG32, reg_CX));
2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_pop(p, x86_make_reg(file_REG32, reg_AX));
2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_fn_arg( struct x86_function *p,
2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           unsigned arg )
2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch(x86_target(p))
2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case X86_64_WIN64_ABI:
2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Microsoft uses a different calling convention than the rest of the world */
2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch(arg)
2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_CX);
2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_DX);
2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_R8);
2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_R9);
2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Win64 allocates stack slots as if it pushed the first 4 arguments too */
2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_disp(x86_make_reg(file_REG32, reg_SP),
2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               p->stack_offset + arg * 8);
2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case X86_64_STD_ABI:
2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch(arg)
2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_DI);
2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_SI);
2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_DX);
2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_CX);
2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 5:
2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_R8);
2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 6:
2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_reg(file_REG32, reg_R9);
2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return x86_make_disp(x86_make_reg(file_REG32, reg_SP),
2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               p->stack_offset + (arg - 6) * 8);     /* ??? */
2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case X86_32:
2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return x86_make_disp(x86_make_reg(file_REG32, reg_SP),
2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			p->stack_offset + arg * 4);	/* ??? */
2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0 && "Unexpected x86 target ABI in x86_fn_arg");
2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return x86_make_reg(file_REG32, reg_CX); /* not used / silence warning */
2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void x86_init_func_common( struct x86_function *p )
2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   util_cpu_detect();
2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->caps = 0;
2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(util_cpu_caps.has_mmx)
2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->caps |= X86_MMX;
2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(util_cpu_caps.has_mmx2)
2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->caps |= X86_MMX2;
2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(util_cpu_caps.has_sse)
2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->caps |= X86_SSE;
2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(util_cpu_caps.has_sse2)
2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->caps |= X86_SSE2;
2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(util_cpu_caps.has_sse3)
2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->caps |= X86_SSE3;
2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(util_cpu_caps.has_sse4_1)
2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->caps |= X86_SSE4_1;
2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->csr = p->store;
2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_START();
2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_init_func( struct x86_function *p )
2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->size = 0;
2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->store = NULL;
2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_init_func_common(p);
2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_init_func_size( struct x86_function *p, unsigned code_size )
2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->size = code_size;
2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->store = rtasm_exec_malloc(code_size);
2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (p->store == NULL) {
2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p->store = p->error_overflow;
2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x86_init_func_common(p);
2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_release_func( struct x86_function *p )
2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (p->store && p->store != p->error_overflow)
2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rtasm_exec_free(p->store);
2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->store = NULL;
2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->csr = NULL;
2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p->size = 0;
2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE x86_func
2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoidptr_to_x86_func(void *v)
2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   union {
2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *v;
2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      x86_func f;
2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } u;
2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(sizeof(u.v) == sizeof(u.f));
2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u.v = v;
2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return u.f;
2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx86_func x86_get_func( struct x86_function *p )
2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DUMP_END();
2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (DISASSEM && p->store)
2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf("disassemble %p %p\n", p->store, p->csr);
2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (p->store == p->error_overflow)
2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return voidptr_to_x86_func(NULL);
2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return voidptr_to_x86_func(p->store);
2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86sse_dummy( void );
2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86sse_dummy( void )
2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2232