1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin                                   host_ppc_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
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Copyright (C) 2004-2012 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_PPC_DEFS_H
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __VEX_HOST_PPC_DEFS_H
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Num registers used for function calls */
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PPC_N_REGPARMS 8
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Registers. --------- */
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The usual HReg abstraction.  There are 32 real int regs,
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   32 real float regs, and 32 real vector regs.
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppHRegPPC ( HReg );
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR0  ( Bool mode64 ); // scratch reg / zero reg
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR1  ( Bool mode64 ); // Stack Frame Pointer
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR2  ( Bool mode64 ); // not used: TOC pointer
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR3  ( Bool mode64 );
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR4  ( Bool mode64 );
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR5  ( Bool mode64 );
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR6  ( Bool mode64 );
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR7  ( Bool mode64 );
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR8  ( Bool mode64 );
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR9  ( Bool mode64 );
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR10 ( Bool mode64 );
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR11 ( Bool mode64 );
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR12 ( Bool mode64 );
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR13 ( Bool mode64 );
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR14 ( Bool mode64 );
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR15 ( Bool mode64 );
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR16 ( Bool mode64 );
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR17 ( Bool mode64 );
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR18 ( Bool mode64 );
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR19 ( Bool mode64 );
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR20 ( Bool mode64 );
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR21 ( Bool mode64 );
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR22 ( Bool mode64 );
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR23 ( Bool mode64 );
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR24 ( Bool mode64 );
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR25 ( Bool mode64 );
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR26 ( Bool mode64 );
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR27 ( Bool mode64 );
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR28 ( Bool mode64 );
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR29 ( Bool mode64 ); // reserved for dispatcher
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR30 ( Bool mode64 ); // used as VMX spill temp
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR31 ( Bool mode64 ); // GuestStatePtr (callee-saved)
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR0  ( void );
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR1  ( void );
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR2  ( void );
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR3  ( void );
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR4  ( void );
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR5  ( void );
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR6  ( void );
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR7  ( void );
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR8  ( void );
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR9  ( void );
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR10 ( void );
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR11 ( void );
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR12 ( void );
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR13 ( void );
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR14 ( void );
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR15 ( void );
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR16 ( void );
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR17 ( void );
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR18 ( void );
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR19 ( void );
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR20 ( void );
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR21 ( void );
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR22 ( void );
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR23 ( void );
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR24 ( void );
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR25 ( void );
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR26 ( void );
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR27 ( void );
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR28 ( void );
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR29 ( void );
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR30 ( void );
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR31 ( void );
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR0  ( void );
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR1  ( void );
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR2  ( void );
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR3  ( void );
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR4  ( void );
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR5  ( void );
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR6  ( void );
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR7  ( void );
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR8  ( void );
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR9  ( void );
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR10 ( void );
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR11 ( void );
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR12 ( void );
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR13 ( void );
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR14 ( void );
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR15 ( void );
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR16 ( void );
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR17 ( void );
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR18 ( void );
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR19 ( void );
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR20 ( void );
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR21 ( void );
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR22 ( void );
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR23 ( void );
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR24 ( void );
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR25 ( void );
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR26 ( void );
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR27 ( void );
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR28 ( void );
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR29 ( void );
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR30 ( void );
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR31 ( void );
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define StackFramePtr(_mode64) hregPPC_GPR1(_mode64)
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GuestStatePtr(_mode64) hregPPC_GPR31(_mode64)
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Condition codes --------- */
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This gives names from bitfields in CR; hence it names BI numbers */
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Using IBM/hardware indexing convention */
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // CR7, which we use for integer compares
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pcf_7LT  = 28,  /* neg  | lt          */
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pcf_7GT  = 29,  /* pos  | gt          */
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pcf_7EQ  = 30,  /* zero | equal       */
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pcf_7SO  = 31,  /* summary overflow   */
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pcf_NONE = 32   /* no condition; used with Pct_ALWAYS */
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCCondFlag;
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {   /* Maps bc bitfield BO */
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pct_FALSE  = 0x4, /* associated PPCCondFlag must not be Pcf_NONE */
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pct_TRUE   = 0xC, /* associated PPCCondFlag must not be Pcf_NONE */
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pct_ALWAYS = 0x14 /* associated PPCCondFlag must be Pcf_NONE */
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCCondTest;
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondFlag flag;
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondTest test;
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCCondCode;
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCCondCode ( PPCCondCode );
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* constructor */
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCCondCode mk_PPCCondCode ( PPCCondTest, PPCCondFlag );
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* false->true, true->false */
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCCondTest invertCondTest ( PPCCondTest );
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Memory address expressions (amodes). --------- */
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Pam_IR=1,      /* Immediate (signed 16-bit) + Reg */
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Pam_RR=2       /* Reg1 + Reg2     */
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAModeTag;
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCAModeTag tag;
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg base;
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Int  index;
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } IR;
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg base;
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg index;
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } RR;
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } Pam;
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAMode;
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* PPCAMode_IR ( Int,  HReg );
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* PPCAMode_RR ( HReg, HReg );
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* dopyPPCAMode ( PPCAMode* );
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCAMode ( PPCAMode* );
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u16/s16. --------- */
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ("RH" == "Register or Halfword immediate") */
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Prh_Imm=3,
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Prh_Reg=4
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRHTag;
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRHTag tag;
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool   syned;
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UShort imm16;
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Imm;
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Reg;
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Prh;
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRH;
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRH* PPCRH_Imm ( Bool, UShort );
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRH* PPCRH_Reg ( HReg );
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCRH ( PPCRH* );
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u32/64. --------- */
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pri_Imm=5,
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pri_Reg=6
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRITag;
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRITag tag;
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ULong Imm;
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         HReg  Reg;
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pri;
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRI;
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRI* PPCRI_Imm ( ULong );
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRI* PPCRI_Reg( HReg );
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCRI ( PPCRI* );
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a vector reg or a s6. --------- */
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ("VI" == "Vector Register or Immediate") */
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pvi_Imm=7,
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pvi_Reg=8
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCVI5sTag;
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCVI5sTag tag;
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Char Imm5s;
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         HReg Reg;
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pvi;
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCVI5s;
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCVI5s* PPCVI5s_Imm ( Char );
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCVI5s* PPCVI5s_Reg ( HReg );
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCVI5s ( PPCVI5s* );
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Instructions. --------- */
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_NEG,
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_NOT,
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_CLZ32,
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_CLZ64,
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_EXTSW
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCUnaryOp;
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCUnaryOp ( PPCUnaryOp );
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Palu_INVALID,
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Palu_ADD, Palu_SUB,
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Palu_AND, Palu_OR, Palu_XOR,
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAluOp;
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCAluOp ( PPCAluOp,
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                      Bool /* is the 2nd operand an immediate? */);
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pshft_INVALID,
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pshft_SHL, Pshft_SHR, Pshft_SAR,
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCShftOp;
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCShftOp ( PPCShftOp,
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       Bool /* is the 2nd operand an immediate? */,
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       Bool /* is this a 32bit or 64bit op? */ );
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pfp_INVALID,
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Ternary */
362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_MADDD,  Pfp_MSUBD,
363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_MADDS,  Pfp_MSUBS,
364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DFPADD, Pfp_DFPADDQ,
365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DFPSUB, Pfp_DFPSUBQ,
366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DFPMUL, Pfp_DFPMULQ,
367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DFPDIV, Pfp_DFPDIVQ,
368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DQUAQ,  Pfp_DRRNDQ,
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Binary */
371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_ADDD, Pfp_SUBD, Pfp_MULD, Pfp_DIVD,
372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_ADDS, Pfp_SUBS, Pfp_MULS, Pfp_DIVS,
373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DRSP, Pfp_DRDPQ, Pfp_DCTFIX, Pfp_DCTFIXQ, Pfp_DCFFIX,
374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DQUA, Pfp_RRDTR, Pfp_DIEX, Pfp_DIEXQ,
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Unary */
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pfp_SQRT, Pfp_ABS, Pfp_NEG, Pfp_MOV, Pfp_RES, Pfp_RSQRTE,
378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_FRIN, Pfp_FRIM, Pfp_FRIP, Pfp_FRIZ,
379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DSCLI, Pfp_DSCRI, Pfp_DSCLIQ, Pfp_DSCRIQ, Pfp_DCTDP,
380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DCTQPQ, Pfp_DCFFIXQ, Pfp_DXEX, Pfp_DXEXQ,
381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCFpOp;
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCFpOp ( PPCFpOp );
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_INVALID,
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Integer Unary */
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_MOV,                             /* Mov */
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_NOT,                             /* Bitwise */
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_UNPCKH8S,  Pav_UNPCKH16S,        /* Unpack */
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_UNPCKL8S,  Pav_UNPCKL16S,
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_UNPCKHPIX, Pav_UNPCKLPIX,
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Integer Binary */
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_AND, Pav_OR, Pav_XOR,            /* Bitwise */
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_ADDU, Pav_QADDU, Pav_QADDS,
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_SUBU, Pav_QSUBU, Pav_QSUBS,
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_OMULU, Pav_OMULS, Pav_EMULU, Pav_EMULS,
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_AVGU, Pav_AVGS,
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_MAXU, Pav_MAXS,
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_MINU, Pav_MINS,
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Compare (always affects CR field 6) */
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_CMPEQU, Pav_CMPGTU, Pav_CMPGTS,
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Shift */
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_SHL, Pav_SHR, Pav_SAR, Pav_ROTL,
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Pack */
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_PACKUU, Pav_QPACKUU, Pav_QPACKSU, Pav_QPACKSS,
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_PACKPXL,
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Merge */
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_MRGHI, Pav_MRGLO,
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAvOp;
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCAvOp ( PPCAvOp );
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_INVALID,
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Floating point binary */
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_ADDF, Pavfp_SUBF, Pavfp_MULF,
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_MAXF, Pavfp_MINF,
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_CMPEQF, Pavfp_CMPGTF, Pavfp_CMPGEF,
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Floating point unary */
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_RCPF, Pavfp_RSQRTF,
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_CVTU2F, Pavfp_CVTS2F, Pavfp_QCVTF2U, Pavfp_QCVTF2S,
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_ROUNDM, Pavfp_ROUNDP, Pavfp_ROUNDN, Pavfp_ROUNDZ,
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAvFpOp;
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCAvFpOp ( PPCAvFpOp );
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_LI,         /* load word (32/64-bit) immediate (fake insn) */
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Alu,        /* word add/sub/and/or/xor */
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Shft,       /* word shl/shr/sar */
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AddSubC,    /* add/sub with read/write carry */
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Cmp,        /* word compare */
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Unary,      /* not, neg, clz */
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_MulL,       /* widening multiply */
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Div,        /* div */
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Call,       /* call to address in register */
459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_XDirect,    /* direct transfer to GA */
460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_XIndir,     /* indirect transfer to GA */
461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_XAssisted,  /* assisted transfer to GA */
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_CMov,       /* conditional move */
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Load,       /* zero-extending load a 8|16|32|64 bit value from mem */
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_LoadL,      /* load-linked (lwarx/ldarx) 32|64 bit value from mem */
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Store,      /* store a 8|16|32|64 bit value to mem */
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_StoreC,     /* store-conditional (stwcx./stdcx.) 32|64 bit val */
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Set,        /* convert condition code to value 0 or 1 */
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_MfCR,       /* move from condition register to GPR */
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_MFence,     /* mem fence */
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpUnary,    /* FP unary op */
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpBinary,   /* FP binary op */
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpMulAcc,   /* FP multipy-accumulate style op */
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpLdSt,     /* FP load/store */
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpSTFIW,    /* stfiwx */
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpRSP,      /* FP round IEEE754 double to IEEE754 single */
477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pin_FpCftI,     /* fcfid[u,s,us]/fctid[u]/fctiw[u] */
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpCMov,     /* FP floating point conditional move */
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpLdFPSCR,  /* mtfsf */
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpCmp,      /* FP compare, generating value into int reg */
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_RdWrLR,     /* Read/Write Link Register */
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvLdSt,     /* AV load/store (kludging for AMode_IR) */
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvUnary,    /* AV unary general reg=>reg */
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBinary,   /* AV binary general reg,reg=>reg */
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBin8x16,  /* AV binary, 8x4 */
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBin16x8,  /* AV binary, 16x4 */
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBin32x4,  /* AV binary, 32x4 */
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBin32Fx4, /* AV FP binary, 32Fx4 */
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvUn32Fx4,  /* AV FP unary,  32Fx4 */
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvPerm,     /* AV permute (shuffle) */
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvSel,      /* AV select */
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvShlDbl,   /* AV shift-left double by imm */
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvSplat,    /* One elem repeated throughout dst */
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvLdVSCR,   /* mtvscr */
500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_AvCMov,     /* AV conditional move */
501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp64Unary,   /* DFP64  unary op */
502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp128Unary,  /* DFP128 unary op */
503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpShift,     /* Decimal floating point shift by immediate value */
504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp64Binary,  /* DFP64  binary op */
505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp128Binary, /* DFP128 binary op */
506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpShift128,  /* 128-bit Decimal floating point shift by
507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         * immediate value */
508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpD128toD64, /* DFP 128 to DFP 64 op */
509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpI64StoD128, /* DFP signed integer to DFP 128 */
510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpRound,       /* D64 round to D64 */
511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpRound128,    /* D128 round to D128 */
512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_ExtractExpD128, /* DFP, extract 64 bit exponent */
513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_InsertExpD128,  /* DFP, insert 64 bit exponent and 128 bit binary
514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * significand into a DFP 128-bit value*/
515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp64Cmp,       /* DFP 64-bit compare, generating value into
516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * int reg */
517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp128Cmp,      /* DFP 128-bit  compare, generating value into
518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * int reg */
519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpQuantize,    /* D64 quantize using register value, significance
520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * round */
521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpQuantize128, /* D128 quantize using register value, significance
522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * round */
523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_EvCheck,    /* Event check */
524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_ProfInc     /* 64-bit profile counter increment */
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstrTag;
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Destinations are on the LEFT (first operand) */
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCInstrTag tag;
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Get a 32/64-bit literal into a register.
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            May turn into a number of real insns. */
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ULong imm64;
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } LI;
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Integer add/sub/and/or/xor.  Limitations:
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            - For add, the immediate, if it exists, is a signed 16.
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            - For sub, the immediate, if it exists, is a signed 16
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              which may not be -32768, since no such instruction
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              exists, and so we have to emit addi with +32768, but
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              that is not possible.
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            - For and/or/xor,  the immediate, if it exists,
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              is an unsigned 16.
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         */
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAluOp op;
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     srcL;
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCRH*   srcR;
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Alu;
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Integer shl/shr/sar.
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Limitations: the immediate, if it exists,
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            is a signed 5-bit value between 1 and 31 inclusive.
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         */
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCShftOp op;
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      sz32;   /* mode64 has both 32 and 64bit shft */
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      srcL;
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCRH*    srcR;
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Shft;
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /*  */
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool isAdd;  /* else sub */
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool setC;   /* else read carry */
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AddSubC;
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* If signed, the immediate, if it exists, is a signed 16,
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else it is an unsigned 16. */
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool   syned;
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool   sz32;    /* mode64 has both 32 and 64bit cmp */
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt   crfD;
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg   srcL;
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCRH* srcR;
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Cmp;
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Not, Neg, Clz32/64, Extsw */
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCUnaryOp op;
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       dst;
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       src;
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Unary;
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool syned;  /* meaningless if hi32==False */
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool hi;     /* False=>low, True=>high */
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool sz32;   /* mode64 has both 32 & 64bit mull */
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } MulL;
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* ppc32 div/divu instruction. */
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool extended;
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool syned;
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool sz32;   /* mode64 has both 32 & 64bit div */
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Div;
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Pseudo-insn.  Call target (an absolute address), on given
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            condition (which could be Pct_ALWAYS).  argiregs indicates
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            which of r3 .. r10 carries argument values for this call,
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            using a bit mask (1<<N is set if rN holds an arg, for N in
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            3 .. 10 inclusive). */
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr64      target;
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt        argiregs;
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Call;
616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Update the guest CIA value, then exit requesting to chain
617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            to it.  May be conditional.  Use of Addr64 in order to cope
618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            with 64-bit hosts. */
619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Addr64      dstGA;    /* next guest address */
621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode*   amCIA;    /* amode in guest state for CIA */
622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCCondCode cond;     /* can be ALWAYS */
623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Bool        toFastEP; /* chain to the slow or fast point? */
624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } XDirect;
625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Boring transfer to a guest address not known at JIT time.
626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Not chainable.  May be conditional. */
627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg        dstGA;
629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode*   amCIA;
630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCCondCode cond; /* can be ALWAYS */
631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } XIndir;
632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Assisted transfer to a guest address, most general case.
633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Not chainable.  May be conditional. */
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg        dstGA;
636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode*   amCIA;
637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCCondCode cond; /* can be ALWAYS */
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            IRJumpKind  jk;
639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } XAssisted;
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mov src to dst on the given condition, which may not
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            be the bogus Pct_ALWAYS. */
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCRI*      src;
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } CMov;
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Zero extending loads.  Dst size is host word size */
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* 1|2|4|8 */
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAMode* src;
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Load;
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Load-and-reserve (lwarx, ldarx) */
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar sz; /* 4|8 */
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  src;
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } LoadL;
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 64/32/16/8 bit stores */
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* 1|2|4|8 */
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAMode* dst;
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      src;
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Store;
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Store-conditional (stwcx., stdcx.) */
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar sz; /* 4|8 */
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  src;
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } StoreC;
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Convert a ppc condition code to value 0 or 1. */
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Set;
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Move the entire CR to a GPR */
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } MfCR;
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mem fence.  In short, an insn which flushes all preceding
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            loads and stores as much as possible before continuing.
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            On PPC we emit a "sync". */
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } MFence;
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* PPC Floating point */
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCFpOp op;
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    src;
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpUnary;
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCFpOp op;
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpBinary;
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCFpOp op;
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcML;
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcMR;
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcAcc;
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpMulAcc;
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      isLoad;
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* only 4 (IEEE single) or 8 (IEEE double) */
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      reg;
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAMode* addr;
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpLdSt;
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg addr; /* int reg */
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg data; /* float reg */
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpSTFIW;
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Round 64-bit FP value to 32-bit FP value in an FP reg. */
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpRSP;
720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* fcfid[u,s,us]/fctid[u]/fctiw[u].  Only some combinations
721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            of the various fields are allowed.  This is asserted for
722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            and documented in the code for the constructor,
723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            PPCInstr_FpCftI, in host_ppc_defs.c.  */
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool fromI; /* True== I->F,    False== F->I */
726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool int32; /* True== I is 32, False== I is 64 */
727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool syned;
728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool flt64; /* True== F is 64, False== F is 32 */
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpCftI;
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* FP mov src to dst on the given condition. */
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        src;
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpCMov;
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Load FP Status & Control Register */
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            UInt dfp_rm;
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpLdFPSCR;
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Do a compare, generating result into an int register. */
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar crfD;
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  srcL;
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  srcR;
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpCmp;
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Read/Write Link Register */
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool wrLR;
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg gpr;
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } RdWrLR;
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Simplistic AltiVec */
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      isLoad;
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz;      /* 8|16|32|128 */
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      reg;
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAMode* addr;
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvLdSt;
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    src;
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvUnary;
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBinary;
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBin8x16;
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBin16x8;
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBin32x4;
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvFpOp op;
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      srcL;
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      srcR;
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBin32Fx4;
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvFpOp op;
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      src;
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvUn32Fx4;
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Perm,Sel,SlDbl,Splat are all weird AV permutations */
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg ctl;
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvPerm;
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg ctl;
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvSel;
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar shift;
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  srcL;
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  srcR;
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvShlDbl;
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar    sz;   /* 8,16,32 */
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCVI5s* src;
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvSplat;
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mov src to dst on the given condition, which may not
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            be the bogus Xcc_ALWAYS. */
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        src;
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvCMov;
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Load AltiVec Status & Control Register */
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvLdVSCR;
839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src;
843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp64Unary;
844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcL;
848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR;
849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp64Binary;
850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst;
853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src;
854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* shift;
855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpShift;
856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_hi;
861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_lo;
862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp128Unary;
863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* The dst is used to pass the left source operand in and return
865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * the result.
866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             */
867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR_hi;
871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR_lo;
872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp128Binary;
873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst_hi;
876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst_lo;
877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src_hi;
878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src_lo;
879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* shift;
880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpShift128;
881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src;
884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* r_rmc;
885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpRound;
886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_hi;
890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_lo;
891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* r_rmc;
892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpRound128;
893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	    PPCFpOp op;
895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcL;
897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR;
898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* rmc;
899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpQuantize;
900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	    PPCFpOp op;
902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_hi;
905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_lo;
906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  	    PPCRI* rmc;
907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpQuantize128;
908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_hi;
912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_lo;
913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } ExtractExpD128;
914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	    PPCFpOp op;
916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcL;
919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR_hi;
920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR_lo;
921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } InsertExpD128;
922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst;
925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src_hi;
926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src_lo;
927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpD128toD64;
928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst_hi;
931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst_lo;
932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src;
933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpI64StoD128;
934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            UChar crfD;
936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  dst;
937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcL;
938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcR;
939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp64Cmp;
940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            UChar crfD;
942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  dst;
943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcL_hi;
944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcL_lo;
945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcR_hi;
946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcR_lo;
947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp128Cmp;
948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode* amCounter;
950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode* amFailAddr;
951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } EvCheck;
952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* No fields.  The address of the counter to inc is
954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               installed later, post-translation, by patching it in,
955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               as it is not known at translation time. */
956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } ProfInc;
957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } Pin;
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr;
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_LI         ( HReg, ULong, Bool );
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Alu        ( PPCAluOp, HReg, HReg, PPCRH* );
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Shft       ( PPCShftOp, Bool sz32, HReg, HReg, PPCRH* );
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AddSubC    ( Bool, Bool, HReg, HReg, HReg );
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Cmp        ( Bool, Bool, UInt, HReg, PPCRH* );
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Unary      ( PPCUnaryOp op, HReg dst, HReg src );
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MulL       ( Bool syned, Bool hi32, Bool sz32, HReg, HReg, HReg );
969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_Div        ( Bool extended, Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR );
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Call       ( PPCCondCode, Addr64, UInt );
971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XDirect    ( Addr64 dstGA, PPCAMode* amCIA,
972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       PPCCondCode cond, Bool toFastEP );
973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XIndir     ( HReg dstGA, PPCAMode* amCIA,
974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       PPCCondCode cond );
975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XAssisted  ( HReg dstGA, PPCAMode* amCIA,
976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       PPCCondCode cond, IRJumpKind jk );
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_CMov       ( PPCCondCode, HReg dst, PPCRI* src );
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Load       ( UChar sz,
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       HReg dst, PPCAMode* src, Bool mode64 );
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_LoadL      ( UChar sz,
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       HReg dst, HReg src, Bool mode64 );
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Store      ( UChar sz, PPCAMode* dst,
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       HReg src, Bool mode64 );
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_StoreC     ( UChar sz, HReg dst, HReg src,
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       Bool mode64 );
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Set        ( PPCCondCode cond, HReg dst );
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MfCR       ( HReg dst );
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MFence     ( void );
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpUnary    ( PPCFpOp op, HReg dst, HReg src );
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpBinary   ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR );
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpMulAcc   ( PPCFpOp op, HReg dst, HReg srcML,
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                                   HReg srcMR, HReg srcAcc );
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpLdSt     ( Bool isLoad, UChar sz, HReg, PPCAMode* );
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpSTFIW    ( HReg addr, HReg data );
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpRSP      ( HReg dst, HReg src );
997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_FpCftI     ( Bool fromI, Bool int32, Bool syned,
998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       Bool dst64, HReg dst, HReg src );
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpCMov     ( PPCCondCode, HReg dst, HReg src );
1000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_FpLdFPSCR  ( HReg src, Bool dfp_rm );
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpCmp      ( HReg dst, HReg srcL, HReg srcR );
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_RdWrLR     ( Bool wrLR, HReg gpr );
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvLdSt     ( Bool isLoad, UChar sz, HReg, PPCAMode* );
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvUnary    ( PPCAvOp op, HReg dst, HReg src );
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBinary   ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin8x16  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin16x8  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin32x4  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, HReg srcL, HReg srcR );
1012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_AvUn32Fx4  ( PPCAvFpOp op, HReg dst, HReg src );
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvPerm     ( HReg dst, HReg srcL, HReg srcR, HReg ctl );
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvSel      ( HReg ctl, HReg dst, HReg srcL, HReg srcR );
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvShlDbl   ( UChar shift, HReg dst, HReg srcL, HReg srcR );
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvSplat    ( UChar sz, HReg dst, PPCVI5s* src );
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvCMov     ( PPCCondCode, HReg dst, HReg src );
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvLdVSCR   ( HReg src );
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Unary  ( PPCFpOp op, HReg dst, HReg src );
1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Binary ( PPCFpOp op, HReg dst, HReg srcL,
1022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        HReg srcR );
1023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpShift    ( PPCFpOp op, HReg dst, HReg src,
1024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        PPCRI* shift );
1025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Unary  ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         HReg srcR_hi, HReg srcR_lo );
1027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Binary ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         HReg srcR_hi, HReg srcR_lo );
1029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpShift128  ( PPCFpOp op, HReg dst_hi, HReg src_hi,
1030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         HReg dst_lo, HReg src_lo,
1031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         PPCRI* shift );
1032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst,
1033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         HReg dst_lo, HReg src_lo);
1034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpI64StoD128  ( PPCFpOp op, HReg dst_hi,
1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg dst_lo, HReg src);
1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpRound       ( HReg dst, HReg src, PPCRI* r_rmc );
1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpRound128    ( HReg dst_hi, HReg dst_lo, HReg src_hi,
1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg src_lo, PPCRI* r_rmc );
1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpQuantize    ( PPCFpOp op, HReg dst, HReg srcL,
1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg srcR, PPCRI* rmc );
1041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi,
1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg dst_lo,
1043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg src_hi,
1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg src_lo, PPCRI* rmc );
1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op,   HReg dst,
1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg src_hi, HReg src_lo );
1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_InsertExpD128  ( PPCFpOp op,   HReg dst_hi,
1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg dst_lo,  HReg srcL,
1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg srcR_hi, HReg srcR_lo );
1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Cmp       ( HReg dst, HReg srcL, HReg srcR );
1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Cmp      ( HReg dst, HReg srcL_hi, HReg srcL_lo,
1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg srcR_hi, HReg srcR_lo );
1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_EvCheck     ( PPCAMode* amCounter,
1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        PPCAMode* amFailAddr );
1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_ProfInc     ( void );
1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void ppPPCInstr(PPCInstr*, Bool mode64);
1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Some functions that insulate the register allocator from details
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   of the underlying instruction set. */
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void         getRegUsage_PPCInstr ( HRegUsage*, PPCInstr*, Bool mode64 );
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void         mapRegs_PPCInstr     ( HRegRemap*, PPCInstr* , Bool mode64);
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool         isMove_PPCInstr      ( PPCInstr*, HReg*, HReg* );
1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int          emit_PPCInstr        ( /*MB_MOD*/Bool* is_profInc,
1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           UChar* buf, Int nbuf, PPCInstr* i,
1067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           Bool mode64,
1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_chain_me_to_slowEP,
1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_chain_me_to_fastEP,
1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_xindir,
1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_xassisted );
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genSpill_PPC  ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg rreg, Int offsetB, Bool mode64 );
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg rreg, Int offsetB, Bool mode64 );
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void         getAllocableRegs_PPC ( Int*, HReg**, Bool mode64 );
1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern HInstrArray* iselSB_PPC           ( IRSB*,
1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           VexArch,
1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           VexArchInfo*,
1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           VexAbiInfo*,
1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Int offs_Host_EvC_Counter,
1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Int offs_Host_EvC_FailAddr,
1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Bool chainingAllowed,
1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Bool addProfInc,
1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Addr64 max_ga );
1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check?  This is kind of a kludge because it
1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   depends on the offsets of host_EvC_FAILADDR and
1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   host_EvC_COUNTER. */
1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int evCheckSzB_PPC ( void );
1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Perform a chaining and unchaining of an XDirect jump. */
1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange chainXDirect_PPC ( void* place_to_chain,
1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        void* disp_cp_chain_me_EXPECTED,
1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        void* place_to_jump_to,
1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        Bool  mode64 );
1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange unchainXDirect_PPC ( void* place_to_unchain,
1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          void* place_to_jump_to_EXPECTED,
1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          void* disp_cp_chain_me,
1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          Bool  mode64 );
1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter location into an existing ProfInc point. */
1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange patchProfInc_PPC ( void*  place_to_patch,
1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        ULong* location_of_counter,
1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        Bool   mode64 );
1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __VEX_HOST_PPC_DEFS_H */
1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                     host_ppc_defs.h ---*/
1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
1116