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
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2004-2013 OpenWorks LLP
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      info@open-works.net
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02110-1301, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Neither the names of the U.S. Department of Energy nor the
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   University of California nor the names of its contributors may be
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   used to endorse or promote products derived from this software
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   without prior written permission.
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __VEX_HOST_PPC_DEFS_H
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __VEX_HOST_PPC_DEFS_H
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_basictypes.h"
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex.h"                      // VexArch
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "host_generic_regs.h"           // HReg
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Num registers used for function calls */
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PPC_N_REGPARMS 8
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Registers. --------- */
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The usual HReg abstraction.  There are 32 real int regs,
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   32 real float regs, and 32 real vector regs.
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppHRegPPC ( HReg );
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR0  ( Bool mode64 ); // scratch reg / zero reg
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR1  ( Bool mode64 ); // Stack Frame Pointer
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR2  ( Bool mode64 ); // not used: TOC pointer
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR3  ( Bool mode64 );
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR4  ( Bool mode64 );
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR5  ( Bool mode64 );
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR6  ( Bool mode64 );
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR7  ( Bool mode64 );
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR8  ( Bool mode64 );
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR9  ( Bool mode64 );
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR10 ( Bool mode64 );
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR11 ( Bool mode64 );
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR12 ( Bool mode64 );
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR13 ( Bool mode64 );
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR14 ( Bool mode64 );
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR15 ( Bool mode64 );
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR16 ( Bool mode64 );
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR17 ( Bool mode64 );
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR18 ( Bool mode64 );
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR19 ( Bool mode64 );
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR20 ( Bool mode64 );
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR21 ( Bool mode64 );
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR22 ( Bool mode64 );
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR23 ( Bool mode64 );
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR24 ( Bool mode64 );
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR25 ( Bool mode64 );
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR26 ( Bool mode64 );
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR27 ( Bool mode64 );
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR28 ( Bool mode64 );
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR29 ( Bool mode64 ); // reserved for dispatcher
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR30 ( Bool mode64 ); // used as VMX spill temp
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR31 ( Bool mode64 ); // GuestStatePtr (callee-saved)
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR0  ( void );
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR1  ( void );
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR2  ( void );
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR3  ( void );
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR4  ( void );
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR5  ( void );
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR6  ( void );
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR7  ( void );
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR8  ( void );
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR9  ( void );
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR10 ( void );
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR11 ( void );
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR12 ( void );
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR13 ( void );
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR14 ( void );
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR15 ( void );
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR16 ( void );
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR17 ( void );
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR18 ( void );
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR19 ( void );
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR20 ( void );
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR21 ( void );
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR22 ( void );
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR23 ( void );
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR24 ( void );
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR25 ( void );
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR26 ( void );
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR27 ( void );
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR28 ( void );
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR29 ( void );
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR30 ( void );
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR31 ( void );
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR0  ( void );
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR1  ( void );
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR2  ( void );
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR3  ( void );
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR4  ( void );
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR5  ( void );
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR6  ( void );
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR7  ( void );
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR8  ( void );
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR9  ( void );
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR10 ( void );
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR11 ( void );
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR12 ( void );
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR13 ( void );
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR14 ( void );
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR15 ( void );
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR16 ( void );
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR17 ( void );
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR18 ( void );
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR19 ( void );
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR20 ( void );
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR21 ( void );
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR22 ( void );
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR23 ( void );
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR24 ( void );
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR25 ( void );
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR26 ( void );
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR27 ( void );
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR28 ( void );
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR29 ( void );
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR30 ( void );
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR31 ( void );
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define StackFramePtr(_mode64) hregPPC_GPR1(_mode64)
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GuestStatePtr(_mode64) hregPPC_GPR31(_mode64)
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Condition codes --------- */
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This gives names from bitfields in CR; hence it names BI numbers */
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Using IBM/hardware indexing convention */
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // CR7, which we use for integer compares
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pcf_7LT  = 28,  /* neg  | lt          */
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pcf_7GT  = 29,  /* pos  | gt          */
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pcf_7EQ  = 30,  /* zero | equal       */
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pcf_7SO  = 31,  /* summary overflow   */
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pcf_NONE = 32   /* no condition; used with Pct_ALWAYS */
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCCondFlag;
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {   /* Maps bc bitfield BO */
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pct_FALSE  = 0x4, /* associated PPCCondFlag must not be Pcf_NONE */
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pct_TRUE   = 0xC, /* associated PPCCondFlag must not be Pcf_NONE */
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pct_ALWAYS = 0x14 /* associated PPCCondFlag must be Pcf_NONE */
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCCondTest;
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondFlag flag;
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondTest test;
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCCondCode;
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCCondCode ( PPCCondCode );
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* constructor */
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCCondCode mk_PPCCondCode ( PPCCondTest, PPCCondFlag );
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* false->true, true->false */
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCCondTest invertCondTest ( PPCCondTest );
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Memory address expressions (amodes). --------- */
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Pam_IR=1,      /* Immediate (signed 16-bit) + Reg */
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     Pam_RR=2       /* Reg1 + Reg2     */
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAModeTag;
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCAModeTag tag;
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg base;
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Int  index;
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } IR;
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg base;
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg index;
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } RR;
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } Pam;
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAMode;
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* PPCAMode_IR ( Int,  HReg );
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* PPCAMode_RR ( HReg, HReg );
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* dopyPPCAMode ( PPCAMode* );
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCAMode ( PPCAMode* );
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u16/s16. --------- */
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ("RH" == "Register or Halfword immediate") */
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Prh_Imm=3,
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Prh_Reg=4
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRHTag;
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRHTag tag;
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool   syned;
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UShort imm16;
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Imm;
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg reg;
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Reg;
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Prh;
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRH;
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRH* PPCRH_Imm ( Bool, UShort );
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRH* PPCRH_Reg ( HReg );
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCRH ( PPCRH* );
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u32/64. --------- */
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pri_Imm=5,
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pri_Reg=6
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRITag;
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRITag tag;
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ULong Imm;
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         HReg  Reg;
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pri;
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRI;
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRI* PPCRI_Imm ( ULong );
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRI* PPCRI_Reg( HReg );
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCRI ( PPCRI* );
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a vector reg or a s6. --------- */
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ("VI" == "Vector Register or Immediate") */
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pvi_Imm=7,
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pvi_Reg=8
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCVI5sTag;
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCVI5sTag tag;
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Char Imm5s;
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         HReg Reg;
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pvi;
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCVI5s;
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCVI5s* PPCVI5s_Imm ( Char );
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCVI5s* PPCVI5s_Reg ( HReg );
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCVI5s ( PPCVI5s* );
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Instructions. --------- */
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_NEG,
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_NOT,
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_CLZ32,
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_CLZ64,
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pun_EXTSW
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCUnaryOp;
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCUnaryOp ( PPCUnaryOp );
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Palu_INVALID,
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Palu_ADD, Palu_SUB,
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Palu_AND, Palu_OR, Palu_XOR,
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAluOp;
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* showPPCAluOp ( PPCAluOp,
343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            Bool /* is the 2nd operand an immediate? */);
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pshft_INVALID,
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pshft_SHL, Pshft_SHR, Pshft_SAR,
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCShftOp;
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* showPPCShftOp ( PPCShftOp,
356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             Bool /* is the 2nd operand an immediate? */,
357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             Bool /* is this a 32bit or 64bit op? */ );
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pfp_INVALID,
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Ternary */
366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_MADDD,  Pfp_MSUBD,
367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_MADDS,  Pfp_MSUBS,
368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DFPADD, Pfp_DFPADDQ,
369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DFPSUB, Pfp_DFPSUBQ,
370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DFPMUL, Pfp_DFPMULQ,
371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DFPDIV, Pfp_DFPDIVQ,
372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DQUAQ,  Pfp_DRRNDQ,
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Binary */
375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_ADDD, Pfp_SUBD, Pfp_MULD, Pfp_DIVD,
376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_ADDS, Pfp_SUBS, Pfp_MULS, Pfp_DIVS,
377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DRSP, Pfp_DRDPQ, Pfp_DCTFIX, Pfp_DCTFIXQ, Pfp_DCFFIX,
378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pfp_DQUA, Pfp_RRDTR, Pfp_DIEX, Pfp_DIEXQ, Pfp_DRINTN,
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Unary */
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pfp_SQRT, Pfp_ABS, Pfp_NEG, Pfp_MOV, Pfp_RES, Pfp_RSQRTE,
382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_FRIN, Pfp_FRIM, Pfp_FRIP, Pfp_FRIZ,
383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DSCLI, Pfp_DSCRI, Pfp_DSCLIQ, Pfp_DSCRIQ, Pfp_DCTDP,
384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pfp_DCTQPQ, Pfp_DCFFIXQ, Pfp_DXEX, Pfp_DXEXQ,
385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCFpOp;
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCFpOp ( PPCFpOp );
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_INVALID,
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Integer Unary */
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_MOV,                             /* Mov */
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_NOT,                             /* Bitwise */
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_UNPCKH8S,  Pav_UNPCKH16S,        /* Unpack */
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_UNPCKL8S,  Pav_UNPCKL16S,
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_UNPCKHPIX, Pav_UNPCKLPIX,
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Integer Binary */
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_AND, Pav_OR, Pav_XOR,            /* Bitwise */
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_ADDU, Pav_QADDU, Pav_QADDS,
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_SUBU, Pav_QSUBU, Pav_QSUBS,
408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pav_MULU,
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_OMULU, Pav_OMULS, Pav_EMULU, Pav_EMULS,
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_AVGU, Pav_AVGS,
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_MAXU, Pav_MAXS,
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_MINU, Pav_MINS,
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Compare (always affects CR field 6) */
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_CMPEQU, Pav_CMPGTU, Pav_CMPGTS,
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Shift */
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_SHL, Pav_SHR, Pav_SAR, Pav_ROTL,
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Pack */
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_PACKUU, Pav_QPACKUU, Pav_QPACKSU, Pav_QPACKSS,
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_PACKPXL,
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Merge */
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pav_MRGHI, Pav_MRGLO,
426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Concatenation */
428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pav_CATODD, Pav_CATEVEN,
429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Polynomial Multipy-Add */
431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pav_POLYMULADD,
432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Cipher */
434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pav_CIPHERV128, Pav_CIPHERLV128, Pav_NCIPHERV128, Pav_NCIPHERLV128,
435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pav_CIPHERSUBV128,
436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Hash */
438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pav_SHA256, Pav_SHA512,
439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* BCD Arithmetic */
441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pav_BCDAdd, Pav_BCDSub,
442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* zero count */
444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pav_ZEROCNTBYTE, Pav_ZEROCNTWORD, Pav_ZEROCNTHALF, Pav_ZEROCNTDBL,
445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Vector bit matrix transpose by byte */
447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pav_BITMTXXPOSE,
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAvOp;
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCAvOp ( PPCAvOp );
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_INVALID,
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Floating point binary */
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_ADDF, Pavfp_SUBF, Pavfp_MULF,
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_MAXF, Pavfp_MINF,
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_CMPEQF, Pavfp_CMPGTF, Pavfp_CMPGEF,
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Floating point unary */
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_RCPF, Pavfp_RSQRTF,
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_CVTU2F, Pavfp_CVTS2F, Pavfp_QCVTF2U, Pavfp_QCVTF2S,
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pavfp_ROUNDM, Pavfp_ROUNDP, Pavfp_ROUNDN, Pavfp_ROUNDZ,
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAvFpOp;
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCAvFpOp ( PPCAvFpOp );
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_LI,         /* load word (32/64-bit) immediate (fake insn) */
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Alu,        /* word add/sub/and/or/xor */
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Shft,       /* word shl/shr/sar */
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AddSubC,    /* add/sub with read/write carry */
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Cmp,        /* word compare */
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Unary,      /* not, neg, clz */
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_MulL,       /* widening multiply */
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Div,        /* div */
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Call,       /* call to address in register */
486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_XDirect,    /* direct transfer to GA */
487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_XIndir,     /* indirect transfer to GA */
488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_XAssisted,  /* assisted transfer to GA */
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_CMov,       /* conditional move */
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Load,       /* zero-extending load a 8|16|32|64 bit value from mem */
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_LoadL,      /* load-linked (lwarx/ldarx) 32|64 bit value from mem */
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Store,      /* store a 8|16|32|64 bit value to mem */
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_StoreC,     /* store-conditional (stwcx./stdcx.) 32|64 bit val */
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_Set,        /* convert condition code to value 0 or 1 */
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_MfCR,       /* move from condition register to GPR */
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_MFence,     /* mem fence */
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpUnary,    /* FP unary op */
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpBinary,   /* FP binary op */
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpMulAcc,   /* FP multipy-accumulate style op */
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpLdSt,     /* FP load/store */
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpSTFIW,    /* stfiwx */
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpRSP,      /* FP round IEEE754 double to IEEE754 single */
504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Pin_FpCftI,     /* fcfid[u,s,us]/fctid[u]/fctiw[u] */
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpCMov,     /* FP floating point conditional move */
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpLdFPSCR,  /* mtfsf */
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_FpCmp,      /* FP compare, generating value into int reg */
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_RdWrLR,     /* Read/Write Link Register */
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvLdSt,     /* AV load/store (kludging for AMode_IR) */
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvUnary,    /* AV unary general reg=>reg */
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBinary,   /* AV binary general reg,reg=>reg */
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBin8x16,  /* AV binary, 8x4 */
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBin16x8,  /* AV binary, 16x4 */
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBin32x4,  /* AV binary, 32x4 */
518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pin_AvBin64x2,  /* AV binary, 64x2 */
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvBin32Fx4, /* AV FP binary, 32Fx4 */
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvUn32Fx4,  /* AV FP unary,  32Fx4 */
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvPerm,     /* AV permute (shuffle) */
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvSel,      /* AV select */
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvShlDbl,   /* AV shift-left double by imm */
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvSplat,    /* One elem repeated throughout dst */
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Pin_AvLdVSCR,   /* mtvscr */
528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_AvCMov,     /* AV conditional move */
529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pin_AvCipherV128Unary,  /* AV Vector unary Cipher */
530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pin_AvCipherV128Binary, /* AV Vector binary Cipher */
531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pin_AvHashV128Binary, /* AV Vector binary Hash */
532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Pin_AvBCDV128Trinary, /* BCD Arithmetic */
533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp64Unary,   /* DFP64  unary op */
534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp128Unary,  /* DFP128 unary op */
535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpShift,     /* Decimal floating point shift by immediate value */
536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp64Binary,  /* DFP64  binary op */
537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp128Binary, /* DFP128 binary op */
538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpShift128,  /* 128-bit Decimal floating point shift by
539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         * immediate value */
540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpD128toD64, /* DFP 128 to DFP 64 op */
541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpI64StoD128, /* DFP signed integer to DFP 128 */
542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpRound,       /* D64 round to D64 */
543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpRound128,    /* D128 round to D128 */
544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_ExtractExpD128, /* DFP, extract 64 bit exponent */
545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_InsertExpD128,  /* DFP, insert 64 bit exponent and 128 bit binary
546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * significand into a DFP 128-bit value*/
547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp64Cmp,       /* DFP 64-bit compare, generating value into
548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * int reg */
549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_Dfp128Cmp,      /* DFP 128-bit  compare, generating value into
550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * int reg */
551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpQuantize,    /* D64 quantize using register value, significance
552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * round */
553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_DfpQuantize128, /* D128 quantize using register value, significance
554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * round */
555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_EvCheck,    /* Event check */
556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Pin_ProfInc     /* 64-bit profile counter increment */
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstrTag;
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Destinations are on the LEFT (first operand) */
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCInstrTag tag;
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      union {
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Get a 32/64-bit literal into a register.
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            May turn into a number of real insns. */
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ULong imm64;
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } LI;
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Integer add/sub/and/or/xor.  Limitations:
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            - For add, the immediate, if it exists, is a signed 16.
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            - For sub, the immediate, if it exists, is a signed 16
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              which may not be -32768, since no such instruction
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              exists, and so we have to emit addi with +32768, but
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              that is not possible.
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            - For and/or/xor,  the immediate, if it exists,
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              is an unsigned 16.
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         */
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAluOp op;
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     srcL;
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCRH*   srcR;
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Alu;
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Integer shl/shr/sar.
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Limitations: the immediate, if it exists,
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            is a signed 5-bit value between 1 and 31 inclusive.
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         */
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCShftOp op;
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      sz32;   /* mode64 has both 32 and 64bit shft */
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      srcL;
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCRH*    srcR;
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Shft;
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /*  */
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool isAdd;  /* else sub */
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool setC;   /* else read carry */
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AddSubC;
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* If signed, the immediate, if it exists, is a signed 16,
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else it is an unsigned 16. */
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool   syned;
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool   sz32;    /* mode64 has both 32 and 64bit cmp */
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt   crfD;
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg   srcL;
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCRH* srcR;
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Cmp;
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Not, Neg, Clz32/64, Extsw */
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCUnaryOp op;
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       dst;
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg       src;
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Unary;
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool syned;  /* meaningless if hi32==False */
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool hi;     /* False=>low, True=>high */
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool sz32;   /* mode64 has both 32 & 64bit mull */
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } MulL;
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* ppc32 div/divu instruction. */
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool extended;
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool syned;
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool sz32;   /* mode64 has both 32 & 64bit div */
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Div;
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Pseudo-insn.  Call target (an absolute address), on given
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            condition (which could be Pct_ALWAYS).  argiregs indicates
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            which of r3 .. r10 carries argument values for this call,
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            using a bit mask (1<<N is set if rN holds an arg, for N in
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            3 .. 10 inclusive). */
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Addr64      target;
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UInt        argiregs;
647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            RetLoc      rloc;     /* where the return value will be */
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Call;
649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Update the guest CIA value, then exit requesting to chain
650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            to it.  May be conditional.  Use of Addr64 in order to cope
651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            with 64-bit hosts. */
652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Addr64      dstGA;    /* next guest address */
654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode*   amCIA;    /* amode in guest state for CIA */
655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCCondCode cond;     /* can be ALWAYS */
656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Bool        toFastEP; /* chain to the slow or fast point? */
657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } XDirect;
658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Boring transfer to a guest address not known at JIT time.
659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Not chainable.  May be conditional. */
660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg        dstGA;
662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode*   amCIA;
663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCCondCode cond; /* can be ALWAYS */
664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } XIndir;
665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Assisted transfer to a guest address, most general case.
666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            Not chainable.  May be conditional. */
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg        dstGA;
669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode*   amCIA;
670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCCondCode cond; /* can be ALWAYS */
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            IRJumpKind  jk;
672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } XAssisted;
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mov src to dst on the given condition, which may not
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            be the bogus Pct_ALWAYS. */
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCRI*      src;
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } CMov;
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Zero extending loads.  Dst size is host word size */
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* 1|2|4|8 */
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAMode* src;
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Load;
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Load-and-reserve (lwarx, ldarx) */
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar sz; /* 4|8 */
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  src;
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } LoadL;
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* 64/32/16/8 bit stores */
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* 1|2|4|8 */
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAMode* dst;
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      src;
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Store;
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Store-conditional (stwcx., stdcx.) */
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar sz; /* 4|8 */
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  src;
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } StoreC;
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Convert a ppc condition code to value 0 or 1. */
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } Set;
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Move the entire CR to a GPR */
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } MfCR;
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mem fence.  In short, an insn which flushes all preceding
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            loads and stores as much as possible before continuing.
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            On PPC we emit a "sync". */
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } MFence;
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* PPC Floating point */
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCFpOp op;
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    src;
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpUnary;
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCFpOp op;
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpBinary;
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCFpOp op;
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcML;
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcMR;
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcAcc;
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpMulAcc;
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      isLoad;
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz; /* only 4 (IEEE single) or 8 (IEEE double) */
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      reg;
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAMode* addr;
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpLdSt;
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg addr; /* int reg */
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg data; /* float reg */
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpSTFIW;
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Round 64-bit FP value to 32-bit FP value in an FP reg. */
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpRSP;
753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* fcfid[u,s,us]/fctid[u]/fctiw[u].  Only some combinations
754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            of the various fields are allowed.  This is asserted for
755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            and documented in the code for the constructor,
756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            PPCInstr_FpCftI, in host_ppc_defs.c.  */
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool fromI; /* True== I->F,    False== F->I */
759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool int32; /* True== I is 32, False== I is 64 */
760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool syned;
761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Bool flt64; /* True== F is 64, False== F is 32 */
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpCftI;
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* FP mov src to dst on the given condition. */
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        src;
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpCMov;
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Load FP Status & Control Register */
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            UInt dfp_rm;
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpLdFPSCR;
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Do a compare, generating result into an int register. */
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar crfD;
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  srcL;
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  srcR;
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } FpCmp;
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Read/Write Link Register */
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool wrLR;
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg gpr;
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } RdWrLR;
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Simplistic AltiVec */
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            Bool      isLoad;
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar     sz;      /* 8|16|32|128 */
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      reg;
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAMode* addr;
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvLdSt;
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    src;
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvUnary;
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBinary;
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBin8x16;
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBin16x8;
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvOp op;
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    dst;
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcL;
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg    srcR;
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBin32x4;
826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Can only be generated for CPUs capable of ISA 2.07 or above */
827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            PPCAvOp op;
829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg    dst;
830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg    srcL;
831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg    srcR;
832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } AvBin64x2;
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvFpOp op;
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      srcL;
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      srcR;
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvBin32Fx4;
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCAvFpOp op;
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      dst;
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg      src;
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvUn32Fx4;
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Perm,Sel,SlDbl,Splat are all weird AV permutations */
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg ctl;
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvPerm;
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg dst;
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcL;
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg srcR;
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg ctl;
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvSel;
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar shift;
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  dst;
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  srcL;
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg  srcR;
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvShlDbl;
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            UChar    sz;   /* 8,16,32 */
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg     dst;
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCVI5s* src;
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvSplat;
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Mov src to dst on the given condition, which may not
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            be the bogus Xcc_ALWAYS. */
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            PPCCondCode cond;
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        dst;
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg        src;
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvCMov;
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Load AltiVec Status & Control Register */
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         struct {
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            HReg src;
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } AvLdVSCR;
879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            PPCAvOp   op;
881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      dst;
882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      src;
883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } AvCipherV128Unary;
884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            PPCAvOp     op;
886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       dst;
887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       src;
888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            PPCRI* s_field;
889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } AvHashV128Binary;
890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            PPCAvOp     op;
892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg       dst;
893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      src1;
894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      src2;
895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            PPCRI*      ps;
896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } AvBCDV128Trinary;
897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            PPCAvOp   op;
899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      dst;
900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      srcL;
901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HReg      srcR;
902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } AvCipherV128Binary;
903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         struct {
904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src;
907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp64Unary;
908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcL;
912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR;
913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp64Binary;
914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst;
917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src;
918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* shift;
919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpShift;
920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_hi;
925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_lo;
926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp128Unary;
927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* The dst is used to pass the left source operand in and return
929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             * the result.
930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             */
931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR_hi;
935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR_lo;
936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp128Binary;
937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst_hi;
940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst_lo;
941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src_hi;
942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src_lo;
943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* shift;
944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpShift128;
945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src;
948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* r_rmc;
949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpRound;
950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_hi;
954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_lo;
955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* r_rmc;
956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpRound128;
957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	    PPCFpOp op;
959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcL;
961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR;
962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCRI* rmc;
963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpQuantize;
964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	    PPCFpOp op;
966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_hi;
969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_lo;
970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  	    PPCRI* rmc;
971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpQuantize128;
972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst;
975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_hi;
976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg src_lo;
977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } ExtractExpD128;
978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	    PPCFpOp op;
980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_hi;
981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg dst_lo;
982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcL;
983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR_hi;
984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg srcR_lo;
985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } InsertExpD128;
986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst;
989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src_hi;
990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src_lo;
991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpD128toD64;
992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCFpOp op;
994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst_hi;
995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   dst_lo;
996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg   src;
997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } DfpI64StoD128;
998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            UChar crfD;
1000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  dst;
1001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcL;
1002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcR;
1003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp64Cmp;
1004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
1005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            UChar crfD;
1006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  dst;
1007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcL_hi;
1008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcL_lo;
1009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcR_hi;
1010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            HReg  srcR_lo;
1011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } Dfp128Cmp;
1012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
1013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode* amCounter;
1014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            PPCAMode* amFailAddr;
1015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } EvCheck;
1016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         struct {
1017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* No fields.  The address of the counter to inc is
1018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               installed later, post-translation, by patching it in,
1019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               as it is not known at translation time. */
1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } ProfInc;
1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } Pin;
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr;
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_LI         ( HReg, ULong, Bool );
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Alu        ( PPCAluOp, HReg, HReg, PPCRH* );
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Shft       ( PPCShftOp, Bool sz32, HReg, HReg, PPCRH* );
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AddSubC    ( Bool, Bool, HReg, HReg, HReg );
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Cmp        ( Bool, Bool, UInt, HReg, PPCRH* );
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Unary      ( PPCUnaryOp op, HReg dst, HReg src );
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MulL       ( Bool syned, Bool hi32, Bool sz32, HReg, HReg, HReg );
1033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_Div        ( Bool extended, Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR );
1034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_Call       ( PPCCondCode, Addr64, UInt, RetLoc );
1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XDirect    ( Addr64 dstGA, PPCAMode* amCIA,
1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       PPCCondCode cond, Bool toFastEP );
1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XIndir     ( HReg dstGA, PPCAMode* amCIA,
1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       PPCCondCode cond );
1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XAssisted  ( HReg dstGA, PPCAMode* amCIA,
1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       PPCCondCode cond, IRJumpKind jk );
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_CMov       ( PPCCondCode, HReg dst, PPCRI* src );
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Load       ( UChar sz,
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       HReg dst, PPCAMode* src, Bool mode64 );
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_LoadL      ( UChar sz,
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       HReg dst, HReg src, Bool mode64 );
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Store      ( UChar sz, PPCAMode* dst,
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       HReg src, Bool mode64 );
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_StoreC     ( UChar sz, HReg dst, HReg src,
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                       Bool mode64 );
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Set        ( PPCCondCode cond, HReg dst );
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MfCR       ( HReg dst );
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MFence     ( void );
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpUnary    ( PPCFpOp op, HReg dst, HReg src );
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpBinary   ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR );
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpMulAcc   ( PPCFpOp op, HReg dst, HReg srcML,
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                                   HReg srcMR, HReg srcAcc );
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpLdSt     ( Bool isLoad, UChar sz, HReg, PPCAMode* );
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpSTFIW    ( HReg addr, HReg data );
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpRSP      ( HReg dst, HReg src );
1061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_FpCftI     ( Bool fromI, Bool int32, Bool syned,
1062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       Bool dst64, HReg dst, HReg src );
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpCMov     ( PPCCondCode, HReg dst, HReg src );
1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_FpLdFPSCR  ( HReg src, Bool dfp_rm );
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpCmp      ( HReg dst, HReg srcL, HReg srcR );
1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_RdWrLR     ( Bool wrLR, HReg gpr );
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvLdSt     ( Bool isLoad, UChar sz, HReg, PPCAMode* );
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvUnary    ( PPCAvOp op, HReg dst, HReg src );
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBinary   ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin8x16  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin16x8  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin32x4  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvBin64x2  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, HReg srcL, HReg srcR );
1077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_AvUn32Fx4  ( PPCAvFpOp op, HReg dst, HReg src );
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvPerm     ( HReg dst, HReg srcL, HReg srcR, HReg ctl );
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvSel      ( HReg ctl, HReg dst, HReg srcL, HReg srcR );
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvShlDbl   ( UChar shift, HReg dst, HReg srcL, HReg srcR );
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvSplat    ( UChar sz, HReg dst, PPCVI5s* src );
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvCMov     ( PPCCondCode, HReg dst, HReg src );
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvLdVSCR   ( HReg src );
1084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvCipherV128Unary  ( PPCAvOp op, HReg dst,
1085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               HReg srcR );
1086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvCipherV128Binary ( PPCAvOp op, HReg dst,
1087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               HReg srcL, HReg srcR );
1088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvHashV128Binary ( PPCAvOp op, HReg dst,
1089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             HReg src, PPCRI* s_field );
1090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvBCDV128Trinary ( PPCAvOp op, HReg dst,
1091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             HReg src1, HReg src2,
1092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             PPCRI* ps );
1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Unary  ( PPCFpOp op, HReg dst, HReg src );
1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Binary ( PPCFpOp op, HReg dst, HReg srcL,
1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        HReg srcR );
1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpShift    ( PPCFpOp op, HReg dst, HReg src,
1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        PPCRI* shift );
1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Unary  ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         HReg srcR_hi, HReg srcR_lo );
1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Binary ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         HReg srcR_hi, HReg srcR_lo );
1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpShift128  ( PPCFpOp op, HReg dst_hi, HReg src_hi,
1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         HReg dst_lo, HReg src_lo,
1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         PPCRI* shift );
1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst,
1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         HReg dst_lo, HReg src_lo);
1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpI64StoD128  ( PPCFpOp op, HReg dst_hi,
1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg dst_lo, HReg src);
1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpRound       ( HReg dst, HReg src, PPCRI* r_rmc );
1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpRound128    ( HReg dst_hi, HReg dst_lo, HReg src_hi,
1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg src_lo, PPCRI* r_rmc );
1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpQuantize    ( PPCFpOp op, HReg dst, HReg srcL,
1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg srcR, PPCRI* rmc );
1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi,
1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg dst_lo,
1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg src_hi,
1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg src_lo, PPCRI* rmc );
1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op,   HReg dst,
1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg src_hi, HReg src_lo );
1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_InsertExpD128  ( PPCFpOp op,   HReg dst_hi,
1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg dst_lo,  HReg srcL,
1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg srcR_hi, HReg srcR_lo );
1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Cmp       ( HReg dst, HReg srcL, HReg srcR );
1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Cmp      ( HReg dst, HReg srcL_hi, HReg srcL_lo,
1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           HReg srcR_hi, HReg srcR_lo );
1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_EvCheck     ( PPCAMode* amCounter,
1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        PPCAMode* amFailAddr );
1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_ProfInc     ( void );
1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void ppPPCInstr(PPCInstr*, Bool mode64);
1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Some functions that insulate the register allocator from details
1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   of the underlying instruction set. */
1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void         getRegUsage_PPCInstr ( HRegUsage*, PPCInstr*, Bool mode64 );
1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void         mapRegs_PPCInstr     ( HRegRemap*, PPCInstr* , Bool mode64);
1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool         isMove_PPCInstr      ( PPCInstr*, HReg*, HReg* );
1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int          emit_PPCInstr        ( /*MB_MOD*/Bool* is_profInc,
1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           UChar* buf, Int nbuf, PPCInstr* i,
1140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           Bool mode64,
1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_chain_me_to_slowEP,
1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_chain_me_to_fastEP,
1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_xindir,
1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           void* disp_cp_xassisted );
1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genSpill_PPC  ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg rreg, Int offsetB, Bool mode64 );
1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg rreg, Int offsetB, Bool mode64 );
1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void         getAllocableRegs_PPC ( Int*, HReg**, Bool mode64 );
1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern HInstrArray* iselSB_PPC           ( IRSB*,
1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           VexArch,
1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           VexArchInfo*,
1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           VexAbiInfo*,
1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Int offs_Host_EvC_Counter,
1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Int offs_Host_EvC_FailAddr,
1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Bool chainingAllowed,
1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Bool addProfInc,
1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                           Addr64 max_ga );
1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check?  This is kind of a kludge because it
1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   depends on the offsets of host_EvC_FAILADDR and
1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   host_EvC_COUNTER. */
1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int evCheckSzB_PPC ( void );
1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Perform a chaining and unchaining of an XDirect jump. */
1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange chainXDirect_PPC ( void* place_to_chain,
1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        void* disp_cp_chain_me_EXPECTED,
1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        void* place_to_jump_to,
1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        Bool  mode64 );
1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange unchainXDirect_PPC ( void* place_to_unchain,
1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          void* place_to_jump_to_EXPECTED,
1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          void* disp_cp_chain_me,
1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          Bool  mode64 );
1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter location into an existing ProfInc point. */
1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange patchProfInc_PPC ( void*  place_to_patch,
1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        ULong* location_of_counter,
1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        Bool   mode64 );
1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __VEX_HOST_PPC_DEFS_H */
1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                     host_ppc_defs.h ---*/
1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
1189