1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin                                   host_x86_defs.h ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Valgrind, a dynamic binary instrumentation
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   framework.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2004-2013 OpenWorks LLP
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      info@open-works.net
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02110-1301, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Neither the names of the U.S. Department of Energy nor the
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   University of California nor the names of its contributors may be
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   used to endorse or promote products derived from this software
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   without prior written permission.
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __VEX_HOST_X86_DEFS_H
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __VEX_HOST_X86_DEFS_H
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_basictypes.h"
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex.h"                      // VexArch
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "host_generic_regs.h"           // HReg
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Registers. --------- */
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The usual HReg abstraction.  There are 8 real int regs,
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   6 real float regs, and 8 real vector regs.
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppHRegX86 ( HReg );
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_EAX ( void );
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_EBX ( void );
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_ECX ( void );
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_EDX ( void );
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_ESP ( void );
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_EBP ( void );
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_ESI ( void );
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_EDI ( void );
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_FAKE0 ( void );
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_FAKE1 ( void );
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_FAKE2 ( void );
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_FAKE3 ( void );
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_FAKE4 ( void );
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_FAKE5 ( void );
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_XMM0 ( void );
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_XMM1 ( void );
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_XMM2 ( void );
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_XMM3 ( void );
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_XMM4 ( void );
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_XMM5 ( void );
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_XMM6 ( void );
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregX86_XMM7 ( void );
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Condition codes, Intel encoding. --------- */
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_O      = 0,  /* overflow           */
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_NO     = 1,  /* no overflow        */
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_B      = 2,  /* below              */
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_NB     = 3,  /* not below          */
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_Z      = 4,  /* zero               */
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_NZ     = 5,  /* not zero           */
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_BE     = 6,  /* below or equal     */
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_NBE    = 7,  /* not below or equal */
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_S      = 8,  /* negative           */
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_NS     = 9,  /* not negative       */
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_P      = 10, /* parity even        */
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_NP     = 11, /* not parity even    */
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_L      = 12, /* jump less          */
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_NL     = 13, /* not less           */
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_LE     = 14, /* less or equal      */
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_NLE    = 15, /* not less or equal  */
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xcc_ALWAYS = 16  /* the usual hack     */
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86CondCode;
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showX86CondCode ( X86CondCode );
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Memory address expressions (amodes). --------- */
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Xam_IR,        /* Immediate + Reg */
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Xam_IRRS       /* Immediate + Reg1 + (Reg2 << Shift) */
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86AModeTag;
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      X86AModeTag tag;
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt imm;
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } IR;
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt imm;
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg base;
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg index;
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Int  shift; /* 0, 1, 2 or 3 only */
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } IRRS;
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } Xam;
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86AMode;
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86AMode* X86AMode_IR   ( UInt, HReg );
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86AMode* X86AMode_IRRS ( UInt, HReg, HReg, Int );
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86AMode* dopyX86AMode ( X86AMode* );
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppX86AMode ( X86AMode* );
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be reg, immediate or memory. --------- */
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xrmi_Imm,
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xrmi_Reg,
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xrmi_Mem
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86RMITag;
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      X86RMITag tag;
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt imm32;
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Imm;
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Reg;
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* am;
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Mem;
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xrmi;
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86RMI;
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86RMI* X86RMI_Imm ( UInt );
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86RMI* X86RMI_Reg ( HReg );
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86RMI* X86RMI_Mem ( X86AMode* );
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppX86RMI ( X86RMI* );
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be reg or immediate only. --------- */
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xri_Imm,
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xri_Reg
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86RITag;
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      X86RITag tag;
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt imm32;
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Imm;
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Reg;
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xri;
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86RI;
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86RI* X86RI_Imm ( UInt );
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86RI* X86RI_Reg ( HReg );
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppX86RI ( X86RI* );
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be reg or memory only. --------- */
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xrm_Reg,
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xrm_Mem
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86RMTag;
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      X86RMTag tag;
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Reg;
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* am;
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Mem;
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xrm;
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86RM;
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86RM* X86RM_Reg ( HReg );
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86RM* X86RM_Mem ( X86AMode* );
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppX86RM ( X86RM* );
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Instructions. --------- */
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xun_NEG,
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xun_NOT
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86UnaryOp;
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showX86UnaryOp ( X86UnaryOp );
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xalu_INVALID,
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xalu_MOV,
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xalu_CMP,
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xalu_ADD, Xalu_SUB, Xalu_ADC, Xalu_SBB,
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xalu_AND, Xalu_OR, Xalu_XOR,
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xalu_MUL
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86AluOp;
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showX86AluOp ( X86AluOp );
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsh_INVALID,
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsh_SHL, Xsh_SHR, Xsh_SAR
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86ShiftOp;
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showX86ShiftOp ( X86ShiftOp );
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xfp_INVALID,
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Binary */
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xfp_ADD, Xfp_SUB, Xfp_MUL, Xfp_DIV,
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xfp_SCALE, Xfp_ATAN, Xfp_YL2X, Xfp_YL2XP1, Xfp_PREM, Xfp_PREM1,
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Unary */
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xfp_SQRT, Xfp_ABS, Xfp_NEG, Xfp_MOV, Xfp_SIN, Xfp_COS, Xfp_TAN,
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xfp_ROUND, Xfp_2XM1
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86FpOp;
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showX86FpOp ( X86FpOp );
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_INVALID,
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* mov */
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_MOV,
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Floating point binary */
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_ADDF, Xsse_SUBF, Xsse_MULF, Xsse_DIVF,
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_MAXF, Xsse_MINF,
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_CMPEQF, Xsse_CMPLTF, Xsse_CMPLEF, Xsse_CMPUNF,
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Floating point unary */
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_RCPF, Xsse_RSQRTF, Xsse_SQRTF,
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Bitwise */
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_AND, Xsse_OR, Xsse_XOR, Xsse_ANDN,
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Integer binary */
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_ADD8,   Xsse_ADD16,   Xsse_ADD32,   Xsse_ADD64,
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_QADD8U, Xsse_QADD16U,
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_QADD8S, Xsse_QADD16S,
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_SUB8,   Xsse_SUB16,   Xsse_SUB32,   Xsse_SUB64,
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_QSUB8U, Xsse_QSUB16U,
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_QSUB8S, Xsse_QSUB16S,
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_MUL16,
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_MULHI16U,
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_MULHI16S,
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_AVG8U, Xsse_AVG16U,
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_MAX16S,
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_MAX8U,
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_MIN16S,
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_MIN8U,
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_CMPEQ8,  Xsse_CMPEQ16,  Xsse_CMPEQ32,
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_CMPGT8S, Xsse_CMPGT16S, Xsse_CMPGT32S,
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_SHL16, Xsse_SHL32, Xsse_SHL64,
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_SHR16, Xsse_SHR32, Xsse_SHR64,
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_SAR16, Xsse_SAR32,
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_PACKSSD, Xsse_PACKSSW, Xsse_PACKUSW,
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_UNPCKHB, Xsse_UNPCKHW, Xsse_UNPCKHD, Xsse_UNPCKHQ,
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xsse_UNPCKLB, Xsse_UNPCKLW, Xsse_UNPCKLD, Xsse_UNPCKLQ
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86SseOp;
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showX86SseOp ( X86SseOp );
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Alu32R,    /* 32-bit mov/arith/logical, dst=REG */
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Alu32M,    /* 32-bit mov/arith/logical, dst=MEM */
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Sh32,      /* 32-bit shift/rotate, dst=REG */
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Test32,    /* 32-bit test of REG or MEM against imm32 (AND, set
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        flags, discard result) */
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Unary32,   /* 32-bit not and neg */
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Lea32,     /* 32-bit compute EA into a reg */
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_MulL,      /* 32 x 32 -> 64 multiply */
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Div,       /* 64/32 -> (32,32) div and mod */
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Sh3232,    /* shldl or shrdl */
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Push,      /* push (32-bit?) value on stack */
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Call,      /* call to address in register */
355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Xin_XDirect,   /* direct transfer to GA */
356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Xin_XIndir,    /* indirect transfer to GA */
357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Xin_XAssisted, /* assisted transfer to GA */
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_CMov32,    /* conditional move */
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_LoadEX,    /* mov{s,z}{b,w}l from mem to reg */
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Store,     /* store 16/8 bit value in memory */
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Set32,     /* convert condition code to 32-bit value */
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Bsfr32,    /* 32-bit bsf/bsr */
363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Xin_MFence,    /* mem fence (not just sse2, but sse0 and 1/mmxext too) */
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_ACAS,      /* 8/16/32-bit lock;cmpxchg */
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_DACAS,     /* lock;cmpxchg8b (doubleword ACAS, 2 x 32-bit only) */
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_FpUnary,   /* FP fake unary op */
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_FpBinary,  /* FP fake binary op */
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_FpLdSt,    /* FP fake load/store */
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_FpLdStI,   /* FP fake load/store, converting to/from Int */
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Fp64to32,  /* FP round IEEE754 double to IEEE754 single */
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_FpCMov,    /* FP fake floating point conditional move */
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_FpLdCW,    /* fldcw */
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_FpStSW_AX, /* fstsw %ax */
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_FpCmp,     /* FP compare, generating a C320 value into int reg */
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_SseConst,  /* Generate restricted SSE literal */
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_SseLdSt,   /* SSE load/store, no alignment constraints */
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_SseLdzLO,  /* SSE load low 32/64 bits, zero remainder of reg */
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Sse32Fx4,  /* SSE binary, 32Fx4 */
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Sse32FLo,  /* SSE binary, 32F in lowest lane only */
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Sse64Fx2,  /* SSE binary, 64Fx2 */
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_Sse64FLo,  /* SSE binary, 64F in lowest lane only */
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_SseReRg,   /* SSE binary general reg-reg, Re, Rg */
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Xin_SseCMov,   /* SSE conditional move */
386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Xin_SseShuf,   /* SSE2 shuffle (pshufd) */
387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Xin_EvCheck,   /* Event check */
388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Xin_ProfInc    /* 64-bit profile counter increment */
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86InstrTag;
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Destinations are on the RIGHT (second operand) */
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      X86InstrTag tag;
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AluOp op;
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86RMI*  src;
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Alu32R;
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AluOp  op;
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86RI*    src;
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* dst;
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Alu32M;
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86ShiftOp op;
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt  src;  /* shift amount, or 0 means %cl */
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Sh32;
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt   imm32;
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86RM* dst; /* not written, only read */
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Test32;
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Not and Neg */
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86UnaryOp op;
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       dst;
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Unary32;
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 32-bit compute EA into a reg */
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* am;
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Lea32;
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* EDX:EAX = EAX *s/u r/m32 */
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool   syned;
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86RM* src;
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } MulL;
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* x86 div/idiv instruction.  Modifies EDX and EAX and reads src. */
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool   syned;
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86RM* src;
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Div;
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* shld/shrd.  op may only be Xsh_SHL or Xsh_SHR */
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86ShiftOp op;
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt       amt;   /* shift amount, or 0 means %cl */
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       src;
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       dst;
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Sh3232;
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86RMI* src;
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Push;
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Pseudo-insn.  Call target (an absolute address), on given
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            condition (which could be Xcc_ALWAYS). */
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86CondCode cond;
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr32      target;
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Int         regparms; /* 0 .. 3 */
453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            RetLoc      rloc;     /* where the return value will be */
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Call;
455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Update the guest EIP value, then exit requesting to chain
456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            to it.  May be conditional.  Urr, use of Addr32 implicitly
457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assumes that wordsize(guest) == wordsize(host). */
458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Addr32      dstGA;    /* next guest address */
460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            X86AMode*   amEIP;    /* amode in guest state for EIP */
461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            X86CondCode cond;     /* can be Xcc_ALWAYS */
462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Bool        toFastEP; /* chain to the slow or fast point? */
463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } XDirect;
464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Boring transfer to a guest address not known at JIT time.
465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Not chainable.  May be conditional. */
466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg        dstGA;
468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            X86AMode*   amEIP;
469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            X86CondCode cond; /* can be Xcc_ALWAYS */
470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } XIndir;
471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Assisted transfer to a guest address, most general case.
472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Not chainable.  May be conditional. */
473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg        dstGA;
475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            X86AMode*   amEIP;
476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            X86CondCode cond; /* can be Xcc_ALWAYS */
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            IRJumpKind  jk;
478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } XAssisted;
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mov src to dst on the given condition, which may not
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            be the bogus Xcc_ALWAYS. */
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86CondCode cond;
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86RM*      src;
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } CMov32;
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Sign/Zero extending loads.  Dst size is always 32 bits. */
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     szSmall;
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      syned;
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* src;
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } LoadEX;
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 16/8 bit stores, which are troublesome (particularly
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            8-bit) */
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* only 1 or 2 */
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      src;
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* dst;
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Store;
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Convert a x86 condition code to a 32-bit value (0 or 1). */
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86CondCode cond;
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Set32;
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 32-bit bsf or bsr. */
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool isFwds;
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Bsfr32;
511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Mem fence (not just sse2, but sse0 and sse1/mmxext too).
512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            In short, an insn which flushes all preceding loads and
513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stores as much as possible before continuing.  On SSE2
514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            we emit a real "mfence", on SSE1 or the MMXEXT subset
515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "sfence ; lock addl $0,0(%esp)" and on SSE0
516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "lock addl $0,0(%esp)".  This insn therefore carries the
517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            host's hwcaps so the assembler knows what to emit. */
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt hwcaps;
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } MFence;
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* "lock;cmpxchg": mem address in .addr,
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             expected value in %eax, new value in %ebx */
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* addr;
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* 1, 2 or 4 */
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } ACAS;
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* "lock;cmpxchg8b": mem address in .addr, expected value in
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            %edx:%eax, new value in %ecx:%ebx */
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* addr;
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } DACAS;
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* X86 Floating point (fake 3-operand, "flat reg file" insns) */
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86FpOp op;
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    src;
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpUnary;
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86FpOp op;
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpBinary;
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      isLoad;
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* only 4 (IEEE single) or 8 (IEEE double) */
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      reg;
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* addr;
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpLdSt;
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Move 64-bit float to/from memory, converting to/from
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            signed int on the way.  Note the conversions will observe
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            the host FPU rounding mode currently in force. */
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      isLoad;
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* only 2, 4 or 8 */
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      reg;
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* addr;
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpLdStI;
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* By observing the current FPU rounding mode, round (etc)
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            src into dst given that dst should be interpreted as an
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            IEEE754 32-bit (float) type. */
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Fp64to32;
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mov src to dst on the given condition, which may not
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            be the bogus Xcc_ALWAYS. */
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86CondCode cond;
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        src;
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpCMov;
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Load the FPU's 16-bit control word (fldcw) */
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* addr;
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         FpLdCW;
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* fstsw %ax */
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* no fields */
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         FpStSW_AX;
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Do a compare, generating the C320 bits into the dst. */
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpCmp;
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Simplistic SSE[123] */
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UShort  con;
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } SseConst;
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      isLoad;
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      reg;
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* addr;
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } SseLdSt;
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* 4 or 8 only */
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      reg;
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86AMode* addr;
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } SseLdzLO;
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86SseOp op;
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     src;
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Sse32Fx4;
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86SseOp op;
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     src;
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Sse32FLo;
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86SseOp op;
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     src;
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Sse64Fx2;
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86SseOp op;
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     src;
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Sse64FLo;
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86SseOp op;
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     src;
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } SseReRg;
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mov src to dst on the given condition, which may not
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            be the bogus Xcc_ALWAYS. */
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            X86CondCode cond;
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        src;
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } SseCMov;
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Int    order; /* 0 <= order <= 0xFF */
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg   src;
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg   dst;
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } SseShuf;
643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            X86AMode* amCounter;
645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            X86AMode* amFailAddr;
646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } EvCheck;
647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* No fields.  The address of the counter to inc is
649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               installed later, post-translation, by patching it in,
650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               as it is not known at translation time. */
651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } ProfInc;
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } Xin;
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   X86Instr;
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Alu32R    ( X86AluOp, X86RMI*, HReg );
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Alu32M    ( X86AluOp, X86RI*,  X86AMode* );
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Unary32   ( X86UnaryOp op, HReg dst );
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Lea32     ( X86AMode* am, HReg dst );
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Sh32      ( X86ShiftOp, UInt, HReg );
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Test32    ( UInt imm32, X86RM* dst );
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_MulL      ( Bool syned, X86RM* );
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Div       ( Bool syned, X86RM* );
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Sh3232    ( X86ShiftOp, UInt amt, HReg src, HReg dst );
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Push      ( X86RMI* );
668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern X86Instr* X86Instr_Call      ( X86CondCode, Addr32, Int, RetLoc );
669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern X86Instr* X86Instr_XDirect   ( Addr32 dstGA, X86AMode* amEIP,
670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      X86CondCode cond, Bool toFastEP );
671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern X86Instr* X86Instr_XIndir    ( HReg dstGA, X86AMode* amEIP,
672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      X86CondCode cond );
673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern X86Instr* X86Instr_XAssisted ( HReg dstGA, X86AMode* amEIP,
674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      X86CondCode cond, IRJumpKind jk );
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_CMov32    ( X86CondCode, X86RM* src, HReg dst );
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_LoadEX    ( UChar szSmall, Bool syned,
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      X86AMode* src, HReg dst );
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Store     ( UChar sz, HReg src, X86AMode* dst );
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Set32     ( X86CondCode cond, HReg dst );
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Bsfr32    ( Bool isFwds, HReg src, HReg dst );
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_MFence    ( UInt hwcaps );
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_ACAS      ( X86AMode* addr, UChar sz );
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_DACAS     ( X86AMode* addr );
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_FpUnary   ( X86FpOp op, HReg src, HReg dst );
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_FpBinary  ( X86FpOp op, HReg srcL, HReg srcR, HReg dst );
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_FpLdSt    ( Bool isLoad, UChar sz, HReg reg, X86AMode* );
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_FpLdStI   ( Bool isLoad, UChar sz, HReg reg, X86AMode* );
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Fp64to32  ( HReg src, HReg dst );
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_FpCMov    ( X86CondCode, HReg src, HReg dst );
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_FpLdCW    ( X86AMode* );
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_FpStSW_AX ( void );
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_FpCmp     ( HReg srcL, HReg srcR, HReg dst );
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_SseConst  ( UShort con, HReg dst );
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_SseLdSt   ( Bool isLoad, HReg, X86AMode* );
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_SseLdzLO  ( Int sz, HReg, X86AMode* );
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Sse32Fx4  ( X86SseOp, HReg, HReg );
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Sse32FLo  ( X86SseOp, HReg, HReg );
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Sse64Fx2  ( X86SseOp, HReg, HReg );
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_Sse64FLo  ( X86SseOp, HReg, HReg );
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_SseReRg   ( X86SseOp, HReg, HReg );
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_SseCMov   ( X86CondCode, HReg src, HReg dst );
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr* X86Instr_SseShuf   ( Int order, HReg src, HReg dst );
705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern X86Instr* X86Instr_EvCheck   ( X86AMode* amCounter,
706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      X86AMode* amFailAddr );
707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern X86Instr* X86Instr_ProfInc   ( void );
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppX86Instr ( X86Instr*, Bool );
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Some functions that insulate the register allocator from details
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   of the underlying instruction set. */
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void         getRegUsage_X86Instr ( HRegUsage*, X86Instr*, Bool );
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void         mapRegs_X86Instr     ( HRegRemap*, X86Instr*, Bool );
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool         isMove_X86Instr      ( X86Instr*, HReg*, HReg* );
717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int          emit_X86Instr        ( /*MB_MOD*/Bool* is_profInc,
718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           UChar* buf, Int nbuf, X86Instr* i,
719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Bool mode64,
720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_chain_me_to_slowEP,
721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_chain_me_to_fastEP,
722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_xindir,
723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_xassisted );
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genSpill_X86  ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg rreg, Int offset, Bool );
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genReload_X86 ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg rreg, Int offset, Bool );
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern X86Instr*    directReload_X86     ( X86Instr* i,
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                           HReg vreg, Short spill_off );
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void         getAllocableRegs_X86 ( Int*, HReg** );
733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern HInstrArray* iselSB_X86           ( IRSB*,
734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           VexArch,
735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           VexArchInfo*,
736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           VexAbiInfo*,
737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Int offs_Host_EvC_Counter,
738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Int offs_Host_EvC_FailAddr,
739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Bool chainingAllowed,
740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Bool addProfInc,
741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Addr64 max_ga );
742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check?  This is kind of a kludge because it
744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   depends on the offsets of host_EvC_FAILADDR and host_EvC_COUNTER,
745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   and so assumes that they are both <= 128, and so can use the short
746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   offset encoding.  This is all checked with assertions, so in the
747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   worst case we will merely assert at startup. */
748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int evCheckSzB_X86 ( void );
749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Perform a chaining and unchaining of an XDirect jump. */
751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange chainXDirect_X86 ( void* place_to_chain,
752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        void* disp_cp_chain_me_EXPECTED,
753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        void* place_to_jump_to );
754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange unchainXDirect_X86 ( void* place_to_unchain,
756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          void* place_to_jump_to_EXPECTED,
757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          void* disp_cp_chain_me );
758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter location into an existing ProfInc point. */
760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange patchProfInc_X86 ( void*  place_to_patch,
761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        ULong* location_of_counter );
762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __VEX_HOST_X86_DEFS_H */
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                     host_x86_defs.h ---*/
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
769