1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin                                   host_ppc_defs.c ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Valgrind, a dynamic binary instrumentation
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   framework.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Copyright (C) 2004-2012 OpenWorks LLP
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      info@open-works.net
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02110-1301, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Neither the names of the U.S. Department of Energy nor the
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   University of California nor the names of its contributors may be
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   used to endorse or promote products derived from this software
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   without prior written permission.
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_basictypes.h"
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex.h"
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_trc_values.h"
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "main_util.h"
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "host_generic_regs.h"
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "host_ppc_defs.h"
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Registers. --------- */
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppHRegPPC ( HReg reg )
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int r;
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   static HChar* ireg32_names[32]
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      = { "%r0",  "%r1",  "%r2",  "%r3",
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "%r4",  "%r5",  "%r6",  "%r7",
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "%r8",  "%r9",  "%r10", "%r11",
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "%r12", "%r13", "%r14", "%r15",
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "%r16", "%r17", "%r18", "%r19",
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "%r20", "%r21", "%r22", "%r23",
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "%r24", "%r25", "%r26", "%r27",
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "%r28", "%r29", "%r30", "%r31" };
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Be generic for all virtual regs. */
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (hregIsVirtual(reg)) {
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHReg(reg);
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* But specific for real regs. */
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (hregClass(reg)) {
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case HRcInt64:
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r = hregNumber(reg);
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(r >= 0 && r < 32);
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s", ireg32_names[r]);
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case HRcInt32:
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r = hregNumber(reg);
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(r >= 0 && r < 32);
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s", ireg32_names[r]);
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case HRcFlt64:
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r = hregNumber(reg);
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(r >= 0 && r < 32);
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%%fr%d", r);
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case HRcVec128:
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r = hregNumber(reg);
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(r >= 0 && r < 32);
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%%v%d", r);
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("ppHRegPPC");
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MkHRegGPR(_n, _mode64) \
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mkHReg(_n, _mode64 ? HRcInt64 : HRcInt32, False)
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR0  ( Bool mode64 ) { return MkHRegGPR( 0, mode64); }
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR1  ( Bool mode64 ) { return MkHRegGPR( 1, mode64); }
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR2  ( Bool mode64 ) { return MkHRegGPR( 2, mode64); }
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR3  ( Bool mode64 ) { return MkHRegGPR( 3, mode64); }
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR4  ( Bool mode64 ) { return MkHRegGPR( 4, mode64); }
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR5  ( Bool mode64 ) { return MkHRegGPR( 5, mode64); }
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR6  ( Bool mode64 ) { return MkHRegGPR( 6, mode64); }
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR7  ( Bool mode64 ) { return MkHRegGPR( 7, mode64); }
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR8  ( Bool mode64 ) { return MkHRegGPR( 8, mode64); }
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR9  ( Bool mode64 ) { return MkHRegGPR( 9, mode64); }
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR10 ( Bool mode64 ) { return MkHRegGPR(10, mode64); }
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR11 ( Bool mode64 ) { return MkHRegGPR(11, mode64); }
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR12 ( Bool mode64 ) { return MkHRegGPR(12, mode64); }
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR13 ( Bool mode64 ) { return MkHRegGPR(13, mode64); }
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR14 ( Bool mode64 ) { return MkHRegGPR(14, mode64); }
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR15 ( Bool mode64 ) { return MkHRegGPR(15, mode64); }
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR16 ( Bool mode64 ) { return MkHRegGPR(16, mode64); }
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR17 ( Bool mode64 ) { return MkHRegGPR(17, mode64); }
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR18 ( Bool mode64 ) { return MkHRegGPR(18, mode64); }
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR19 ( Bool mode64 ) { return MkHRegGPR(19, mode64); }
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR20 ( Bool mode64 ) { return MkHRegGPR(20, mode64); }
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR21 ( Bool mode64 ) { return MkHRegGPR(21, mode64); }
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR22 ( Bool mode64 ) { return MkHRegGPR(22, mode64); }
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR23 ( Bool mode64 ) { return MkHRegGPR(23, mode64); }
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR24 ( Bool mode64 ) { return MkHRegGPR(24, mode64); }
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR25 ( Bool mode64 ) { return MkHRegGPR(25, mode64); }
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR26 ( Bool mode64 ) { return MkHRegGPR(26, mode64); }
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR27 ( Bool mode64 ) { return MkHRegGPR(27, mode64); }
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR28 ( Bool mode64 ) { return MkHRegGPR(28, mode64); }
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR29 ( Bool mode64 ) { return MkHRegGPR(29, mode64); }
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR30 ( Bool mode64 ) { return MkHRegGPR(30, mode64); }
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR31 ( Bool mode64 ) { return MkHRegGPR(31, mode64); }
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef MK_INT_HREG
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR0  ( void ) { return mkHReg( 0, HRcFlt64, False); }
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR1  ( void ) { return mkHReg( 1, HRcFlt64, False); }
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR2  ( void ) { return mkHReg( 2, HRcFlt64, False); }
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR3  ( void ) { return mkHReg( 3, HRcFlt64, False); }
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR4  ( void ) { return mkHReg( 4, HRcFlt64, False); }
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR5  ( void ) { return mkHReg( 5, HRcFlt64, False); }
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR6  ( void ) { return mkHReg( 6, HRcFlt64, False); }
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR7  ( void ) { return mkHReg( 7, HRcFlt64, False); }
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR8  ( void ) { return mkHReg( 8, HRcFlt64, False); }
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR9  ( void ) { return mkHReg( 9, HRcFlt64, False); }
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR10 ( void ) { return mkHReg(10, HRcFlt64, False); }
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR11 ( void ) { return mkHReg(11, HRcFlt64, False); }
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR12 ( void ) { return mkHReg(12, HRcFlt64, False); }
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR13 ( void ) { return mkHReg(13, HRcFlt64, False); }
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR14 ( void ) { return mkHReg(14, HRcFlt64, False); }
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR15 ( void ) { return mkHReg(15, HRcFlt64, False); }
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR16 ( void ) { return mkHReg(16, HRcFlt64, False); }
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR17 ( void ) { return mkHReg(17, HRcFlt64, False); }
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR18 ( void ) { return mkHReg(18, HRcFlt64, False); }
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR19 ( void ) { return mkHReg(19, HRcFlt64, False); }
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR20 ( void ) { return mkHReg(20, HRcFlt64, False); }
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR21 ( void ) { return mkHReg(21, HRcFlt64, False); }
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR22 ( void ) { return mkHReg(22, HRcFlt64, False); }
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR23 ( void ) { return mkHReg(23, HRcFlt64, False); }
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR24 ( void ) { return mkHReg(24, HRcFlt64, False); }
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR25 ( void ) { return mkHReg(25, HRcFlt64, False); }
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR26 ( void ) { return mkHReg(26, HRcFlt64, False); }
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR27 ( void ) { return mkHReg(27, HRcFlt64, False); }
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR28 ( void ) { return mkHReg(28, HRcFlt64, False); }
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR29 ( void ) { return mkHReg(29, HRcFlt64, False); }
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR30 ( void ) { return mkHReg(30, HRcFlt64, False); }
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR31 ( void ) { return mkHReg(31, HRcFlt64, False); }
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR0  ( void ) { return mkHReg( 0, HRcVec128, False); }
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR1  ( void ) { return mkHReg( 1, HRcVec128, False); }
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR2  ( void ) { return mkHReg( 2, HRcVec128, False); }
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR3  ( void ) { return mkHReg( 3, HRcVec128, False); }
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR4  ( void ) { return mkHReg( 4, HRcVec128, False); }
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR5  ( void ) { return mkHReg( 5, HRcVec128, False); }
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR6  ( void ) { return mkHReg( 6, HRcVec128, False); }
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR7  ( void ) { return mkHReg( 7, HRcVec128, False); }
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR8  ( void ) { return mkHReg( 8, HRcVec128, False); }
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR9  ( void ) { return mkHReg( 9, HRcVec128, False); }
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR10 ( void ) { return mkHReg(10, HRcVec128, False); }
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR11 ( void ) { return mkHReg(11, HRcVec128, False); }
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR12 ( void ) { return mkHReg(12, HRcVec128, False); }
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR13 ( void ) { return mkHReg(13, HRcVec128, False); }
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR14 ( void ) { return mkHReg(14, HRcVec128, False); }
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR15 ( void ) { return mkHReg(15, HRcVec128, False); }
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR16 ( void ) { return mkHReg(16, HRcVec128, False); }
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR17 ( void ) { return mkHReg(17, HRcVec128, False); }
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR18 ( void ) { return mkHReg(18, HRcVec128, False); }
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR19 ( void ) { return mkHReg(19, HRcVec128, False); }
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR20 ( void ) { return mkHReg(20, HRcVec128, False); }
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR21 ( void ) { return mkHReg(21, HRcVec128, False); }
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR22 ( void ) { return mkHReg(22, HRcVec128, False); }
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR23 ( void ) { return mkHReg(23, HRcVec128, False); }
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR24 ( void ) { return mkHReg(24, HRcVec128, False); }
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR25 ( void ) { return mkHReg(25, HRcVec128, False); }
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR26 ( void ) { return mkHReg(26, HRcVec128, False); }
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR27 ( void ) { return mkHReg(27, HRcVec128, False); }
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR28 ( void ) { return mkHReg(28, HRcVec128, False); }
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR29 ( void ) { return mkHReg(29, HRcVec128, False); }
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR30 ( void ) { return mkHReg(30, HRcVec128, False); }
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR31 ( void ) { return mkHReg(31, HRcVec128, False); }
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid getAllocableRegs_PPC ( Int* nregs, HReg** arr, Bool mode64 )
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt i=0;
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (mode64)
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *nregs = (32-9) + (32-24) + (32-24);
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   else
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *nregs = (32-7) + (32-24) + (32-24);
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *arr = LibVEX_Alloc(*nregs * sizeof(HReg));
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GPR0 = scratch reg where poss. - some ops interpret as value zero
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GPR1 = stack pointer
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GPR2 = TOC pointer
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR3(mode64);
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR4(mode64);
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR5(mode64);
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR6(mode64);
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR7(mode64);
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR8(mode64);
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR9(mode64);
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR10(mode64);
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!mode64) {
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* in mode64:
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r11 used for calls by ptr / env ptr for some langs
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r12 used for exception handling and global linkage code */
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*arr)[i++] = hregPPC_GPR11(mode64);
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (*arr)[i++] = hregPPC_GPR12(mode64);
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GPR13 = thread specific pointer
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GPR14 and above are callee save.  Yay.
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR14(mode64);
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR15(mode64);
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR16(mode64);
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR17(mode64);
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR18(mode64);
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR19(mode64);
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR20(mode64);
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR21(mode64);
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR22(mode64);
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR23(mode64);
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR24(mode64);
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR25(mode64);
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR26(mode64);
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR27(mode64);
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_GPR28(mode64);
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GPR29 is reserved for the dispatcher
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GPR30 is reserved as AltiVec spill reg temporary
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // GPR31 is reserved for the GuestStatePtr
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Don't waste the reg-allocs's time trawling through zillions of
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      FP registers - they mostly will never be used.  We'll tolerate
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      the occasional extra spill instead. */
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* For both ppc32-linux and ppc64-linux, f14-f31 are callee save.
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      So use them. */
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_FPR14();
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_FPR15();
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_FPR16();
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_FPR17();
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_FPR18();
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_FPR19();
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_FPR20();
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_FPR21();
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Same deal re Altivec */
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* For both ppc32-linux and ppc64-linux, v20-v31 are callee save.
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      So use them. */
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* NB, vr29 is used as a scratch temporary -- do not allocate */
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_VR20();
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_VR21();
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_VR22();
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_VR23();
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_VR24();
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_VR25();
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_VR26();
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (*arr)[i++] = hregPPC_VR27();
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(i == *nregs);
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Condition codes, Intel encoding. --------- */
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCCondCode ( PPCCondCode cond )
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (cond.test == Pct_ALWAYS) return "always";
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (cond.flag) {
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pcf_7SO:
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return (cond.test == Pct_TRUE) ? "cr7.so=1" : "cr7.so=0";
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pcf_7EQ:
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return (cond.test == Pct_TRUE) ? "cr7.eq=1" : "cr7.eq=0";
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pcf_7GT:
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return (cond.test == Pct_TRUE) ? "cr7.gt=1" : "cr7.gt=0";
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pcf_7LT:
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return (cond.test == Pct_TRUE) ? "cr7.lt=1" : "cr7.lt=0";
289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case Pcf_NONE:
290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return "no-flag";
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default: vpanic("ppPPCCondCode");
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* construct condition code */
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCCondCode mk_PPCCondCode ( PPCCondTest test, PPCCondFlag flag )
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCCondCode cc;
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cc.flag = flag;
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cc.test = test;
301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (test == Pct_ALWAYS) {
302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vassert(flag == Pcf_NONE);
303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vassert(flag != Pcf_NONE);
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return cc;
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* false->true, true->false */
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCCondTest invertCondTest ( PPCCondTest ct )
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(ct != Pct_ALWAYS);
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return (ct == Pct_TRUE) ? Pct_FALSE : Pct_TRUE;
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- PPCAMode: memory address expressions. --------- */
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCAMode* PPCAMode_IR ( Int idx, HReg base ) {
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAMode* am = LibVEX_Alloc(sizeof(PPCAMode));
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(idx >= -0x8000 && idx < 0x8000);
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am->tag = Pam_IR;
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am->Pam.IR.base = base;
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am->Pam.IR.index = idx;
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return am;
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCAMode* PPCAMode_RR ( HReg idx, HReg base ) {
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAMode* am = LibVEX_Alloc(sizeof(PPCAMode));
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am->tag = Pam_RR;
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am->Pam.RR.base = base;
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am->Pam.RR.index = idx;
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return am;
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCAMode* dopyPPCAMode ( PPCAMode* am ) {
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (am->tag) {
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pam_IR:
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return PPCAMode_IR( am->Pam.IR.index, am->Pam.IR.base );
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pam_RR:
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return PPCAMode_RR( am->Pam.RR.index, am->Pam.RR.base );
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("dopyPPCAMode");
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCAMode ( PPCAMode* am ) {
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (am->tag) {
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pam_IR:
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (am->Pam.IR.index == 0)
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("0(");
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("%d(", (Int)am->Pam.IR.index);
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(am->Pam.IR.base);
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(")");
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pam_RR:
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(am->Pam.RR.base);
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(am->Pam.RR.index);
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("ppPPCAMode");
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void addRegUsage_PPCAMode ( HRegUsage* u, PPCAMode* am ) {
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (am->tag) {
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pam_IR:
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, am->Pam.IR.base);
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pam_RR:
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, am->Pam.RR.base);
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, am->Pam.RR.index);
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("addRegUsage_PPCAMode");
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapRegs_PPCAMode ( HRegRemap* m, PPCAMode* am ) {
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (am->tag) {
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pam_IR:
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      am->Pam.IR.base = lookupHRegRemap(m, am->Pam.IR.base);
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pam_RR:
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      am->Pam.RR.base = lookupHRegRemap(m, am->Pam.RR.base);
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      am->Pam.RR.index = lookupHRegRemap(m, am->Pam.RR.index);
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("mapRegs_PPCAMode");
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u16/s16. --------- */
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCRH* PPCRH_Imm ( Bool syned, UShort imm16 ) {
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRH* op         = LibVEX_Alloc(sizeof(PPCRH));
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->tag           = Prh_Imm;
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->Prh.Imm.syned = syned;
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->Prh.Imm.imm16 = imm16;
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* If this is a signed value, ensure it's not -32768, so that we
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      are guaranteed always to be able to negate if needed. */
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (syned)
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(imm16 != 0x8000);
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(syned == True || syned == False);
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return op;
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCRH* PPCRH_Reg ( HReg reg ) {
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRH* op       = LibVEX_Alloc(sizeof(PPCRH));
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->tag         = Prh_Reg;
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->Prh.Reg.reg = reg;
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return op;
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCRH ( PPCRH* op ) {
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op->tag) {
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Prh_Imm:
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (op->Prh.Imm.syned)
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("%d", (Int)(Short)op->Prh.Imm.imm16);
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("%u", (UInt)(UShort)op->Prh.Imm.imm16);
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Prh_Reg:
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(op->Prh.Reg.reg);
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("ppPPCRH");
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* An PPCRH can only be used in a "read" context (what would it mean
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   to write or modify a literal?) and so we enumerate its registers
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   accordingly. */
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void addRegUsage_PPCRH ( HRegUsage* u, PPCRH* op ) {
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op->tag) {
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Prh_Imm:
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Prh_Reg:
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, op->Prh.Reg.reg);
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("addRegUsage_PPCRH");
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapRegs_PPCRH ( HRegRemap* m, PPCRH* op ) {
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op->tag) {
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Prh_Imm:
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Prh_Reg:
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      op->Prh.Reg.reg = lookupHRegRemap(m, op->Prh.Reg.reg);
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("mapRegs_PPCRH");
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u32/64. --------- */
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCRI* PPCRI_Imm ( ULong imm64 ) {
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRI* op   = LibVEX_Alloc(sizeof(PPCRI));
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->tag     = Pri_Imm;
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->Pri.Imm = imm64;
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return op;
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCRI* PPCRI_Reg ( HReg reg ) {
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCRI* op   = LibVEX_Alloc(sizeof(PPCRI));
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->tag     = Pri_Reg;
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->Pri.Reg = reg;
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return op;
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCRI ( PPCRI* dst ) {
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (dst->tag) {
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Imm:
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("0x%llx", dst->Pri.Imm);
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Reg:
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(dst->Pri.Reg);
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("ppPPCRI");
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* An PPCRI can only be used in a "read" context (what would it
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mean to write or modify a literal?) and so we enumerate its
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   registers accordingly. */
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void addRegUsage_PPCRI ( HRegUsage* u, PPCRI* dst ) {
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (dst->tag) {
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Imm:
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Reg:
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmRead, dst->Pri.Reg);
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("addRegUsage_PPCRI");
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapRegs_PPCRI ( HRegRemap* m, PPCRI* dst ) {
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (dst->tag) {
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Imm:
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Reg:
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dst->Pri.Reg = lookupHRegRemap(m, dst->Pri.Reg);
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("mapRegs_PPCRI");
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a vector reg or a simm5. --------- */
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCVI5s* PPCVI5s_Imm ( Char simm5 ) {
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCVI5s* op   = LibVEX_Alloc(sizeof(PPCVI5s));
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->tag       = Pvi_Imm;
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->Pvi.Imm5s = simm5;
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(simm5 >= -16 && simm5 <= 15);
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return op;
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCVI5s* PPCVI5s_Reg ( HReg reg ) {
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCVI5s* op = LibVEX_Alloc(sizeof(PPCVI5s));
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->tag     = Pvi_Reg;
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   op->Pvi.Reg = reg;
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(hregClass(reg) == HRcVec128);
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return op;
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCVI5s ( PPCVI5s* src ) {
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (src->tag) {
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pvi_Imm:
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("%d", (Int)src->Pvi.Imm5s);
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pvi_Reg:
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(src->Pvi.Reg);
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("ppPPCVI5s");
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* An PPCVI5s can only be used in a "read" context (what would it
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mean to write or modify a literal?) and so we enumerate its
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   registers accordingly. */
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void addRegUsage_PPCVI5s ( HRegUsage* u, PPCVI5s* dst ) {
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (dst->tag) {
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pvi_Imm:
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pvi_Reg:
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmRead, dst->Pvi.Reg);
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("addRegUsage_PPCVI5s");
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapRegs_PPCVI5s ( HRegRemap* m, PPCVI5s* dst ) {
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (dst->tag) {
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pvi_Imm:
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pvi_Reg:
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dst->Pvi.Reg = lookupHRegRemap(m, dst->Pvi.Reg);
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("mapRegs_PPCVI5s");
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Instructions. --------- */
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCUnaryOp ( PPCUnaryOp op ) {
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op) {
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pun_NOT:   return "not";
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pun_NEG:   return "neg";
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pun_CLZ32: return "cntlzw";
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pun_CLZ64: return "cntlzd";
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pun_EXTSW: return "extsw";
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default: vpanic("showPPCUnaryOp");
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCAluOp ( PPCAluOp op, Bool immR ) {
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op) {
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_ADD: return immR ? "addi"  : "add";
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_SUB: return immR ? "subi"  : "sub";
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_AND: return immR ? "andi." : "and";
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_OR:  return immR ? "ori"   : "or";
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_XOR: return immR ? "xori"  : "xor";
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default: vpanic("showPPCAluOp");
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCShftOp ( PPCShftOp op, Bool immR, Bool sz32 ) {
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op) {
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pshft_SHL: return sz32 ? (immR ? "slwi"  : "slw") :
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    (immR ? "sldi"  : "sld");
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pshft_SHR: return sz32 ? (immR ? "srwi"  : "srw") :
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    (immR ? "srdi"  : "srd");
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pshft_SAR: return sz32 ? (immR ? "srawi" : "sraw") :
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                    (immR ? "sradi" : "srad");
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default: vpanic("showPPCShftOp");
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCFpOp ( PPCFpOp op ) {
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op) {
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_ADDD:   return "fadd";
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_SUBD:   return "fsub";
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MULD:   return "fmul";
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_DIVD:   return "fdiv";
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MADDD:  return "fmadd";
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MSUBD:  return "fmsub";
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MADDS:  return "fmadds";
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MSUBS:  return "fmsubs";
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_ADDS:   return "fadds";
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_SUBS:   return "fsubs";
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MULS:   return "fmuls";
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_DIVS:   return "fdivs";
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_SQRT:   return "fsqrt";
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_ABS:    return "fabs";
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_NEG:    return "fneg";
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MOV:    return "fmr";
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_RES:    return "fres";
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_RSQRTE: return "frsqrte";
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIM:   return "frim";
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIN:   return "frin";
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIP:   return "frip";
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIZ:   return "friz";
633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPADD:     return "dadd";
634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPADDQ:    return "daddq";
635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPSUB:     return "dsub";
636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPSUBQ:    return "dsubq";
637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPMUL:     return "dmul";
638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPMULQ:    return "dmulq";
639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPDIV:     return "ddivd";
640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPDIVQ:    return "ddivq";
641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCTDP:      return "dctdp";
642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DRSP:       return "drsp";
643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCTFIX:     return "dctfix";
644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCFFIX:     return "dcffix";
645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCTQPQ:     return "dctqpq";
646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCFFIXQ:    return "dcffixq";
647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DQUA:       return "dqua";
648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DQUAQ:      return "dquaq";
649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DXEX:       return "dxex";
650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DXEXQ:      return "dxexq";
651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DIEX:       return "diex";
652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DIEXQ:      return "diexq";
653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_RRDTR:      return "rrdtr";
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default: vpanic("showPPCFpOp");
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCAvOp ( PPCAvOp op ) {
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op) {
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Unary */
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MOV:       return "vmr";      /* Mov */
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_AND:       return "vand";     /* Bitwise */
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_OR:        return "vor";
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_XOR:       return "vxor";
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_NOT:       return "vnot";
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_UNPCKH8S:  return "vupkhsb";  /* Unpack */
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_UNPCKH16S: return "vupkhsh";
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_UNPCKL8S:  return "vupklsb";
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_UNPCKL16S: return "vupklsh";
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_UNPCKHPIX: return "vupkhpx";
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_UNPCKLPIX: return "vupklpx";
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Integer binary */
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_ADDU:      return "vaddu_m";  // b,h,w
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QADDU:     return "vaddu_s";  // b,h,w
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QADDS:     return "vadds_s";  // b,h,w
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_SUBU:      return "vsubu_m";  // b,h,w
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QSUBU:     return "vsubu_s";  // b,h,w
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QSUBS:     return "vsubs_s";  // b,h,w
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_OMULU:     return "vmulou";   // b,h
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_OMULS:     return "vmulos";   // b,h
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_EMULU:     return "vmuleu";   // b,h
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_EMULS:     return "vmules";   // b,h
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_AVGU:      return "vavgu";    // b,h,w
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_AVGS:      return "vavgs";    // b,h,w
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MAXU:      return "vmaxu";    // b,h,w
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MAXS:      return "vmaxs";    // b,h,w
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MINU:      return "vminu";    // b,h,w
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MINS:      return "vmins";    // b,h,w
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Compare (always affects CR field 6) */
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_CMPEQU:    return "vcmpequ";  // b,h,w
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_CMPGTU:    return "vcmpgtu";  // b,h,w
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_CMPGTS:    return "vcmpgts";  // b,h,w
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Shift */
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_SHL:       return "vsl";      // ' ',b,h,w
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_SHR:       return "vsr";      // ' ',b,h,w
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_SAR:       return "vsra";     // b,h,w
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_ROTL:      return "vrl";      // b,h,w
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Pack */
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_PACKUU:    return "vpku_um";  // h,w
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QPACKUU:   return "vpku_us";  // h,w
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QPACKSU:   return "vpks_us";  // h,w
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QPACKSS:   return "vpks_ss";  // h,w
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_PACKPXL:   return "vpkpx";
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Merge */
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MRGHI:     return "vmrgh";    // b,h,w
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MRGLO:     return "vmrgl";    // b,h,w
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default: vpanic("showPPCAvOp");
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCAvFpOp ( PPCAvFpOp op ) {
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op) {
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Floating Point Binary */
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ADDF:      return "vaddfp";
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_SUBF:      return "vsubfp";
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_MULF:      return "vmaddfp";
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_MAXF:      return "vmaxfp";
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_MINF:      return "vminfp";
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CMPEQF:    return "vcmpeqfp";
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CMPGTF:    return "vcmpgtfp";
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CMPGEF:    return "vcmpgefp";
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Floating Point Unary */
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_RCPF:      return "vrefp";
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_RSQRTF:    return "vrsqrtefp";
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CVTU2F:    return "vcfux";
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CVTS2F:    return "vcfsx";
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_QCVTF2U:   return "vctuxs";
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_QCVTF2S:   return "vctsxs";
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ROUNDM:    return "vrfim";
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ROUNDP:    return "vrfip";
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ROUNDN:    return "vrfin";
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ROUNDZ:    return "vrfiz";
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default: vpanic("showPPCAvFpOp");
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_LI ( HReg dst, ULong imm64, Bool mode64 )
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i     = LibVEX_Alloc(sizeof(PPCInstr));
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag          = Pin_LI;
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LI.dst   = dst;
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LI.imm64 = imm64;
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!mode64)
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert( (Long)imm64 == (Long)(Int)(UInt)imm64 );
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Alu ( PPCAluOp op, HReg dst,
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         HReg srcL, PPCRH* srcR ) {
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i     = LibVEX_Alloc(sizeof(PPCInstr));
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag          = Pin_Alu;
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Alu.op   = op;
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Alu.dst  = dst;
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Alu.srcL = srcL;
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Alu.srcR = srcR;
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Shft ( PPCShftOp op, Bool sz32,
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          HReg dst, HReg srcL, PPCRH* srcR ) {
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Shft;
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.op   = op;
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.sz32 = sz32;
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.dst  = dst;
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.srcL = srcL;
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.srcR = srcR;
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AddSubC ( Bool isAdd, Bool setC,
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             HReg dst, HReg srcL, HReg srcR ) {
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_AddSubC;
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.isAdd = isAdd;
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.setC  = setC;
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.dst   = dst;
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.srcL  = srcL;
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.srcR  = srcR;
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Cmp ( Bool syned, Bool sz32,
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt crfD, HReg srcL, PPCRH* srcR ) {
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Cmp;
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.syned = syned;
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.sz32  = sz32;
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.crfD  = crfD;
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.srcL  = srcL;
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.srcR  = srcR;
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Unary ( PPCUnaryOp op, HReg dst, HReg src ) {
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Unary;
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Unary.op  = op;
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Unary.dst = dst;
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Unary.src = src;
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MulL ( Bool syned, Bool hi, Bool sz32,
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          HReg dst, HReg srcL, HReg srcR ) {
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_MulL;
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.syned = syned;
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.hi    = hi;
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.sz32  = sz32;
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.dst   = dst;
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.srcL  = srcL;
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.srcR  = srcR;
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* if doing the low word, the signedness is irrelevant, but tie it
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      down anyway. */
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!hi) vassert(!syned);
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_Div ( Bool extended, Bool syned, Bool sz32,
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         HReg dst, HReg srcL, HReg srcR ) {
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Div;
833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   i->Pin.Div.extended = extended;
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.syned = syned;
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.sz32  = sz32;
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.dst   = dst;
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.srcL  = srcL;
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.srcR  = srcR;
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Call ( PPCCondCode cond,
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          Addr64 target, UInt argiregs ) {
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt mask;
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_Call;
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Call.cond     = cond;
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Call.target   = target;
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Call.argiregs = argiregs;
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Only r3 .. r10 inclusive may be used as arg regs. Hence: */
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mask = (1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10);
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(0 == (argiregs & ~mask));
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
854663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XDirect ( Addr64 dstGA, PPCAMode* amCIA,
855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             PPCCondCode cond, Bool toFastEP ) {
856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i             = LibVEX_Alloc(sizeof(PPCInstr));
857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                  = Pin_XDirect;
858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XDirect.dstGA    = dstGA;
859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XDirect.amCIA    = amCIA;
860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XDirect.cond     = cond;
861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XDirect.toFastEP = toFastEP;
862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
864663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XIndir ( HReg dstGA, PPCAMode* amCIA,
865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            PPCCondCode cond ) {
866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i         = LibVEX_Alloc(sizeof(PPCInstr));
867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag              = Pin_XIndir;
868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XIndir.dstGA = dstGA;
869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XIndir.amCIA = amCIA;
870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XIndir.cond  = cond;
871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
873663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XAssisted ( HReg dstGA, PPCAMode* amCIA,
874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               PPCCondCode cond, IRJumpKind jk ) {
875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i            = LibVEX_Alloc(sizeof(PPCInstr));
876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                 = Pin_XAssisted;
877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XAssisted.dstGA = dstGA;
878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XAssisted.amCIA = amCIA;
879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XAssisted.cond  = cond;
880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XAssisted.jk    = jk;
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_CMov  ( PPCCondCode cond,
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           HReg dst, PPCRI* src ) {
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_CMov;
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.CMov.cond = cond;
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.CMov.src  = src;
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.CMov.dst  = dst;
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(cond.test != Pct_ALWAYS);
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Load ( UChar sz,
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          HReg dst, PPCAMode* src, Bool mode64 ) {
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_Load;
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Load.sz    = sz;
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Load.src   = src;
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Load.dst   = dst;
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8);
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sz == 8) vassert(mode64);
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_LoadL ( UChar sz,
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           HReg dst, HReg src, Bool mode64 )
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_LoadL;
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LoadL.sz   = sz;
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LoadL.src  = src;
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LoadL.dst  = dst;
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 4 || sz == 8);
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sz == 8) vassert(mode64);
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Store ( UChar sz, PPCAMode* dst, HReg src,
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           Bool mode64 ) {
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Store;
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Store.sz  = sz;
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Store.src = src;
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Store.dst = dst;
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8);
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sz == 8) vassert(mode64);
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_StoreC ( UChar sz, HReg dst, HReg src, Bool mode64 ) {
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_StoreC;
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.StoreC.sz  = sz;
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.StoreC.src = src;
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.StoreC.dst = dst;
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 4 || sz == 8);
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sz == 8) vassert(mode64);
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Set ( PPCCondCode cond, HReg dst ) {
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i     = LibVEX_Alloc(sizeof(PPCInstr));
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag          = Pin_Set;
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Set.cond = cond;
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Set.dst  = dst;
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MfCR ( HReg dst )
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i     = LibVEX_Alloc(sizeof(PPCInstr));
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag          = Pin_MfCR;
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MfCR.dst = dst;
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MFence ( void )
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr));
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag      = Pin_MFence;
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpUnary ( PPCFpOp op, HReg dst, HReg src ) {
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_FpUnary;
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpUnary.op  = op;
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpUnary.dst = dst;
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpUnary.src = src;
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpBinary ( PPCFpOp op, HReg dst,
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              HReg srcL, HReg srcR ) {
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_FpBinary;
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpBinary.op   = op;
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpBinary.dst  = dst;
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpBinary.srcL = srcL;
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpBinary.srcR = srcR;
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpMulAcc ( PPCFpOp op, HReg dst, HReg srcML,
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          HReg srcMR, HReg srcAcc )
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i            = LibVEX_Alloc(sizeof(PPCInstr));
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                 = Pin_FpMulAcc;
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.op     = op;
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.dst    = dst;
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.srcML  = srcML;
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.srcMR  = srcMR;
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.srcAcc = srcAcc;
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpLdSt ( Bool isLoad, UChar sz,
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg reg, PPCAMode* addr ) {
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_FpLdSt;
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdSt.isLoad = isLoad;
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdSt.sz     = sz;
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdSt.reg    = reg;
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdSt.addr   = addr;
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 4 || sz == 8);
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpSTFIW ( HReg addr, HReg data )
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i         = LibVEX_Alloc(sizeof(PPCInstr));
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag              = Pin_FpSTFIW;
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpSTFIW.addr = addr;
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpSTFIW.data = data;
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpRSP ( HReg dst, HReg src ) {
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_FpRSP;
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpRSP.dst = dst;
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpRSP.src = src;
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1014663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Unary(PPCFpOp op, HReg dst, HReg src) {
1015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) );
1016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag = Pin_Dfp64Unary;
1017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Unary.op = op;
1018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Unary.dst = dst;
1019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Unary.src = src;
1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1022663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Binary(PPCFpOp op, HReg dst, HReg srcL, HReg srcR) {
1023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) );
1024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag = Pin_Dfp64Binary;
1025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Binary.op = op;
1026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Binary.dst = dst;
1027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Binary.srcL = srcL;
1028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Binary.srcR = srcR;
1029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1031663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpShift ( PPCFpOp op, HReg dst, HReg src, PPCRI* shift ) {
1032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i            = LibVEX_Alloc(sizeof(PPCInstr));
1033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                 = Pin_DfpShift;
1034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift.op     = op;
1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift.shift  = shift;
1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift.src    = src;
1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift.dst    = dst;
1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Unary(PPCFpOp op, HReg dst_hi, HReg dst_lo,
1041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                HReg src_hi, HReg src_lo) {
1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) );
1043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag = Pin_Dfp128Unary;
1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.op = op;
1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.dst_hi = dst_hi;
1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.dst_lo = dst_lo;
1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.src_hi = src_hi;
1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.src_lo = src_lo;
1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Binary(PPCFpOp op, HReg dst_hi, HReg dst_lo,
1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                HReg srcR_hi, HReg srcR_lo) {
1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* dst is used to pass the srcL argument and return the result */
1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) );
1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag = Pin_Dfp128Binary;
1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.op = op;
1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.dst_hi = dst_hi;
1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.dst_lo = dst_lo;
1059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.srcR_hi = srcR_hi;
1060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.srcR_lo = srcR_lo;
1061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1063663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpShift128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 HReg src_hi, HReg src_lo,
1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 PPCRI* shift ) {
1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i               = LibVEX_Alloc(sizeof(PPCInstr));
1067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                    = Pin_DfpShift128;
1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.op     = op;
1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.shift  = shift;
1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.src_hi = src_hi;
1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.src_lo = src_lo;
1072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.dst_hi = dst_hi;
1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.dst_lo = dst_lo;
1074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1076663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpRound ( HReg dst, HReg src, PPCRI* r_rmc ) {
1077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                = Pin_DfpRound;
1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound.dst   = dst;
1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound.src   = src;
1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound.r_rmc = r_rmc;
1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpRound128 ( HReg dst_hi, HReg dst_lo, HReg src_hi,
1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 HReg src_lo, PPCRI* r_rmc ) {
1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i               = LibVEX_Alloc(sizeof(PPCInstr));
1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                    = Pin_DfpRound128;
1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.dst_hi = dst_hi;
1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.dst_lo = dst_lo;
1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.src_hi = src_hi;
1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.src_lo = src_lo;
1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.r_rmc  = r_rmc;
1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpQuantize ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR,
1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 PPCRI* rmc ) {
1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i             = LibVEX_Alloc(sizeof(PPCInstr));
1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                  = Pin_DfpQuantize;
1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.op   = op;
1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.dst  = dst;
1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.srcL = srcL;
1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.srcR = srcR;
1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.rmc  = rmc;
1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    HReg src_hi, HReg src_lo, PPCRI* rmc ) {
1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* dst is used to pass left operand in and return result */
1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                  = LibVEX_Alloc(sizeof(PPCInstr));
1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                       = Pin_DfpQuantize128;
1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.op     = op;
1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.dst_hi = dst_hi;
1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.dst_lo = dst_lo;
1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.src_hi = src_hi;
1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.src_lo = src_lo;
1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.rmc    = rmc;
1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst,
1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  HReg src_hi, HReg src_lo ) {
1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                = LibVEX_Alloc(sizeof(PPCInstr));
1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                     = Pin_DfpD128toD64;
1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpD128toD64.op     = op;
1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpD128toD64.src_hi = src_hi;
1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpD128toD64.src_lo = src_lo;
1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpD128toD64.dst    = dst;
1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpI64StoD128 ( PPCFpOp op, HReg dst_hi,
1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   HReg dst_lo, HReg src ) {
1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                 = LibVEX_Alloc(sizeof(PPCInstr));
1132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                      = Pin_DfpI64StoD128;
1133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpI64StoD128.op     = op;
1134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpI64StoD128.src    = src;
1135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpI64StoD128.dst_hi = dst_hi;
1136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpI64StoD128.dst_lo = dst_lo;
1137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op, HReg dst,
1140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    HReg src_hi, HReg src_lo ) {
1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* dst is used to pass the srcL argument */
1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                  = LibVEX_Alloc(sizeof(PPCInstr));
1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                       = Pin_ExtractExpD128;
1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.ExtractExpD128.op     = op;
1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.ExtractExpD128.dst    = dst;
1146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.ExtractExpD128.src_hi = src_hi;
1147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.ExtractExpD128.src_lo = src_lo;
1148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1150663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_InsertExpD128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   HReg srcL, HReg srcR_hi, HReg srcR_lo ) {
1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* dst is used to pass the srcL argument */
1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                  = LibVEX_Alloc(sizeof(PPCInstr));
1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                       = Pin_InsertExpD128;
1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.op      = op;
1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.dst_hi  = dst_hi;
1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.dst_lo  = dst_lo;
1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.srcL    = srcL;
1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.srcR_hi = srcR_hi;
1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.srcR_lo = srcR_lo;
1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Cmp (/* UInt crfD,*/ HReg dst, HReg srcL, HReg srcR ) {
1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag               = Pin_Dfp64Cmp;
1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Cmp.dst = dst;
1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Cmp.srcL = srcL;
1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Cmp.srcR = srcR;
1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Cmp ( HReg dst, HReg srcL_hi, HReg srcL_lo,
1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               HReg srcR_hi, HReg srcR_lo ) {
1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i               = LibVEX_Alloc(sizeof(PPCInstr));
1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                    = Pin_Dfp128Cmp;
1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.dst      = dst;
1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.srcL_hi  = srcL_hi;
1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.srcL_lo  = srcL_lo;
1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.srcR_hi  = srcR_hi;
1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.srcR_lo  = srcR_lo;
1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_EvCheck ( PPCAMode* amCounter,
1183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             PPCAMode* amFailAddr ) {
1184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i               = LibVEX_Alloc(sizeof(PPCInstr));
1185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                    = Pin_EvCheck;
1186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.EvCheck.amCounter  = amCounter;
1187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.EvCheck.amFailAddr = amFailAddr;
1188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1190663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_ProfInc ( void ) {
1191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr));
1192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag      = Pin_ProfInc;
1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovValid combo | fromI | int32 | syned | flt64 |
1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  n       n       n       n    |
1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I64U  |  n       n       n       y    |
1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  n       n       y       n    |
1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I64S  |  n       n       y       y    |
1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  n       y       n       n    |
1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I32U  |  n       y       n       y    |
1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  n       y       y       n    |
1212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I32S  |  n       y       y       y    |
1214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64U->F32  |  y       n       n       n    |
1216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64U->F64  |  y       n       n       y    |
1218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       n       y       n    |
1220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64S->F64  |  y       n       y       y    |
1222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       y       n       n    |
1224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       y       n       y    |
1226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       y       y       n    |
1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       y       y       y    |
1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned,
1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            Bool flt64, HReg dst, HReg src ) {
1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Bool tmp = fromI | int32 | syned | flt64;
1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(tmp == True || tmp == False); // iow, no high bits set
1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort conversion = 0;
1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   conversion = (fromI << 3) | (int32 << 2) | (syned << 1) | flt64;
1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (conversion) {
1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      // Supported conversion operations
1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 1: case 3: case 5: case 7:
1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 8: case 9: case 11:
1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      default:
1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vpanic("PPCInstr_FpCftI(ppc_host)");
1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i         = LibVEX_Alloc(sizeof(PPCInstr));
1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag              = Pin_FpCftI;
1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCftI.fromI = fromI;
1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCftI.int32 = int32;
1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   i->Pin.FpCftI.syned = syned;
1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   i->Pin.FpCftI.flt64 = flt64;
1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCftI.dst   = dst;
1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCftI.src   = src;
1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpCMov ( PPCCondCode cond, HReg dst, HReg src ) {
1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_FpCMov;
1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCMov.cond = cond;
1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCMov.dst  = dst;
1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCMov.src  = src;
1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(cond.test != Pct_ALWAYS);
1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1265663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_FpLdFPSCR ( HReg src, Bool dfp_rm ) {
1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_FpLdFPSCR;
1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdFPSCR.src = src;
1269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.FpLdFPSCR.dfp_rm = dfp_rm ? 1 : 0;
1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpCmp ( HReg dst, HReg srcL, HReg srcR ) {
1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_FpCmp;
1275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCmp.dst  = dst;
1276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCmp.srcL = srcL;
1277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCmp.srcR = srcR;
1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Read/Write Link Register */
1282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_RdWrLR ( Bool wrLR, HReg gpr ) {
1283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_RdWrLR;
1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.RdWrLR.wrLR = wrLR;
1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.RdWrLR.gpr  = gpr;
1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* AltiVec */
1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvLdSt ( Bool isLoad, UChar sz,
1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg reg, PPCAMode* addr ) {
1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_AvLdSt;
1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdSt.isLoad = isLoad;
1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdSt.sz     = sz;
1297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdSt.reg    = reg;
1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdSt.addr   = addr;
1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvUnary ( PPCAvOp op, HReg dst, HReg src ) {
1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_AvUnary;
1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUnary.op  = op;
1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUnary.dst = dst;
1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUnary.src = src;
1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBinary ( PPCAvOp op, HReg dst,
1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              HReg srcL, HReg srcR ) {
1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_AvBinary;
1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBinary.op   = op;
1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBinary.dst  = dst;
1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBinary.srcL = srcL;
1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBinary.srcR = srcR;
1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin8x16 ( PPCAvOp op, HReg dst,
1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               HReg srcL, HReg srcR ) {
1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                = Pin_AvBin8x16;
1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin8x16.op   = op;
1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin8x16.dst  = dst;
1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin8x16.srcL = srcL;
1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin8x16.srcR = srcR;
1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin16x8 ( PPCAvOp op, HReg dst,
1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               HReg srcL, HReg srcR ) {
1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                = Pin_AvBin16x8;
1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin16x8.op   = op;
1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin16x8.dst  = dst;
1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin16x8.srcL = srcL;
1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin16x8.srcR = srcR;
1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin32x4 ( PPCAvOp op, HReg dst,
1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               HReg srcL, HReg srcR ) {
1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                = Pin_AvBin32x4;
1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32x4.op   = op;
1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32x4.dst  = dst;
1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32x4.srcL = srcL;
1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32x4.srcR = srcR;
1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst,
1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                HReg srcL, HReg srcR ) {
1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i            = LibVEX_Alloc(sizeof(PPCInstr));
1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                 = Pin_AvBin32Fx4;
1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32Fx4.op   = op;
1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32Fx4.dst  = dst;
1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32Fx4.srcL = srcL;
1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32Fx4.srcR = srcR;
1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_AvUn32Fx4 ( PPCAvFpOp op, HReg dst, HReg src ) {
1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_AvUn32Fx4;
1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUn32Fx4.op  = op;
1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUn32Fx4.dst = dst;
1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUn32Fx4.src = src;
1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvPerm ( HReg dst, HReg srcL, HReg srcR, HReg ctl ) {
1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_AvPerm;
1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvPerm.dst  = dst;
1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvPerm.srcL = srcL;
1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvPerm.srcR = srcR;
1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvPerm.ctl  = ctl;
1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvSel ( HReg ctl, HReg dst, HReg srcL, HReg srcR ) {
1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_AvSel;
1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSel.ctl  = ctl;
1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSel.dst  = dst;
1381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSel.srcL = srcL;
1382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSel.srcR = srcR;
1383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvShlDbl ( UChar shift, HReg dst,
1386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              HReg srcL, HReg srcR ) {
1387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                = Pin_AvShlDbl;
1389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvShlDbl.shift = shift;
1390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvShlDbl.dst   = dst;
1391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvShlDbl.srcL  = srcL;
1392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvShlDbl.srcR  = srcR;
1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvSplat ( UChar sz, HReg dst, PPCVI5s* src ) {
1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_AvSplat;
1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSplat.sz  = sz;
1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSplat.dst = dst;
1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSplat.src = src;
1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvCMov ( PPCCondCode cond, HReg dst, HReg src ) {
1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_AvCMov;
1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvCMov.cond = cond;
1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvCMov.dst  = dst;
1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvCMov.src  = src;
1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(cond.test != Pct_ALWAYS);
1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvLdVSCR ( HReg src ) {
1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i         = LibVEX_Alloc(sizeof(PPCInstr));
1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag              = Pin_AvLdVSCR;
1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdVSCR.src = src;
1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Pretty Print instructions */
1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void ppLoadImm ( HReg dst, ULong imm, Bool mode64 ) {
1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_printf("li_word ");
1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ppHRegPPC(dst);
1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!mode64) {
1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",0x%08x", (UInt)imm);
1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",0x%016llx", imm);
1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void ppMovReg ( HReg dst, HReg src ) {
1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (hregNumber(dst) != hregNumber(src)) {
1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mr ");
1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(dst);
1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(src);
1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCInstr ( PPCInstr* i, Bool mode64 )
1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (i->tag) {
1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LI:
1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppLoadImm(i->Pin.LI.dst, i->Pin.LI.imm64, mode64);
1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Alu: {
1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      HReg   r_srcL  = i->Pin.Alu.srcL;
1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* rh_srcR = i->Pin.Alu.srcR;
1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* special-case "mr" */
1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Alu.op == Palu_OR &&   // or Rd,Rs,Rs == mr Rd,Rs
1451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          rh_srcR->tag == Prh_Reg &&
1452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          rh_srcR->Prh.Reg.reg == r_srcL) {
1453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("mr ");
1454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.Alu.dst);
1455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",");
1456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(r_srcL);
1457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
1458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* special-case "li" */
1460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Alu.op == Palu_ADD &&   // addi Rd,0,imm == li Rd,imm
1461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          rh_srcR->tag == Prh_Imm &&
1462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          hregNumber(r_srcL) == 0) {
1463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("li ");
1464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.Alu.dst);
1465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",");
1466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppPPCRH(rh_srcR);
1467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
1468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* generic */
1470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAluOp(i->Pin.Alu.op,
1471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     toBool(rh_srcR->tag == Prh_Imm)));
1472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Alu.dst);
1473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(r_srcL);
1475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCRH(rh_srcR);
1477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Shft: {
1480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      HReg   r_srcL  = i->Pin.Shft.srcL;
1481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* rh_srcR = i->Pin.Shft.srcR;
1482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCShftOp(i->Pin.Shft.op,
1483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      toBool(rh_srcR->tag == Prh_Imm),
1484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      i->Pin.Shft.sz32));
1485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Shft.dst);
1486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(r_srcL);
1488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCRH(rh_srcR);
1490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AddSubC:
1493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s%s ",
1494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.AddSubC.isAdd ? "add" : "sub",
1495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.AddSubC.setC ? "c" : "e");
1496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AddSubC.dst);
1497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AddSubC.srcL);
1499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AddSubC.srcR);
1501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Cmp:
1503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s%c%s %%cr%u,",
1504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Cmp.syned ? "cmp" : "cmpl",
1505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Cmp.sz32 ? 'w' : 'd',
1506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Cmp.srcR->tag == Prh_Imm ? "i" : "",
1507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Cmp.crfD);
1508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Cmp.srcL);
1509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCRH(i->Pin.Cmp.srcR);
1511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Unary:
1513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCUnaryOp(i->Pin.Unary.op));
1514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Unary.dst);
1515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Unary.src);
1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MulL:
1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mul%c%c%s ",
1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.MulL.hi ? 'h' : 'l',
1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.MulL.sz32 ? 'w' : 'd',
1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.MulL.hi ? (i->Pin.MulL.syned ? "s" : "u") : "");
1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.MulL.dst);
1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.MulL.srcL);
1526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.MulL.srcR);
1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Div:
1530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("div%c%s%s ",
1531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Div.sz32 ? 'w' : 'd',
1532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 i->Pin.Div.extended ? "e" : "",
1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Div.syned ? "" : "u");
1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Div.dst);
1535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Div.srcL);
1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Div.srcR);
1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Call: {
1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int n;
1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("call: ");
1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Call.cond.test != Pct_ALWAYS) {
1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("if (%s) ", showPPCCondCode(i->Pin.Call.cond));
1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("{ ");
1547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppLoadImm(hregPPC_GPR10(mode64), i->Pin.Call.target, mode64);
1548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(" ; mtctr r10 ; bctrl [");
1549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (n = 0; n < 32; n++) {
1550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (i->Pin.Call.argiregs & (1<<n)) {
1551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vex_printf("r%d", n);
1552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if ((i->Pin.Call.argiregs >> n) > 1)
1553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vex_printf(",");
1554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
1555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("] }");
1557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XDirect:
1560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("(xDirect) ");
1561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("if (%s) { ",
1562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 showPPCCondCode(i->Pin.XDirect.cond));
1563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (mode64) {
1564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("imm64 r30,0x%llx; ", i->Pin.XDirect.dstGA);
1565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("std r30,");
1566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
1567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("imm32 r30,0x%llx; ", i->Pin.XDirect.dstGA);
1568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("stw r30,");
1569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.XDirect.amCIA);
1571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; ");
1572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (mode64) {
1573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("imm64-fixed5 r30,$disp_cp_chain_me_to_%sEP; ",
1574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    i->Pin.XDirect.toFastEP ? "fast" : "slow");
1575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("imm32-fixed2 r30,$disp_cp_chain_me_to_%sEP; ",
1577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    i->Pin.XDirect.toFastEP ? "fast" : "slow");
1578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("mtctr r30; bctrl }");
1580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
1581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XIndir:
1582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("(xIndir) ");
1583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("if (%s) { ",
1584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 showPPCCondCode(i->Pin.XIndir.cond));
1585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", mode64 ? "std" : "stw");
1586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.XIndir.dstGA);
1587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.XIndir.amCIA);
1589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; ");
1590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("imm%s r30,$disp_cp_xindir; ", mode64 ? "64" : "32");
1591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("mtctr r30; bctr }");
1592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
1593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XAssisted:
1594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("(xAssisted) ");
1595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("if (%s) { ",
1596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 showPPCCondCode(i->Pin.XAssisted.cond));
1597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", mode64 ? "std" : "stw");
1598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.XAssisted.dstGA);
1599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.XAssisted.amCIA);
1601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; ");
1602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("li r31,$IRJumpKind_to_TRCVAL(%d); ",
1603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 (Int)i->Pin.XAssisted.jk);
1604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("imm%s r30,$disp_cp_xindir; ", mode64 ? "64" : "32");
1605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("mtctr r30; bctr }");
1606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_CMov:
1608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("cmov (%s) ", showPPCCondCode(i->Pin.CMov.cond));
1609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.CMov.dst);
1610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCRI(i->Pin.CMov.src);
1612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(": ");
1613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.CMov.cond.test != Pct_ALWAYS) {
1614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("if (%s) ", showPPCCondCode(i->Pin.CMov.cond));
1615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("{ ");
1617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.CMov.src->tag == Pri_Imm) {
1618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppLoadImm(i->Pin.CMov.dst, i->Pin.CMov.src->Pri.Imm, mode64);
1619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppMovReg(i->Pin.CMov.dst, i->Pin.CMov.src->Pri.Reg);
1621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(" }");
1623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Load: {
1625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool idxd = toBool(i->Pin.Load.src->tag == Pam_RR);
1626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.Load.sz;
1627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar c_sz = sz==1 ? 'b' : sz==2 ? 'h' : sz==4 ? 'w' : 'd';
1628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("l%c%s%s ", c_sz, sz==8 ? "" : "z", idxd ? "x" : "" );
1629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Load.dst);
1630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCAMode(i->Pin.Load.src);
1632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LoadL:
1635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("l%carx ", i->Pin.LoadL.sz==4 ? 'w' : 'd');
1636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.LoadL.dst);
1637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",%%r0,");
1638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.LoadL.src);
1639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Store: {
1641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.Store.sz;
1642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool idxd = toBool(i->Pin.Store.dst->tag == Pam_RR);
1643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar c_sz = sz==1 ? 'b' : sz==2 ? 'h' : sz==4 ? 'w' : /*8*/ 'd';
1644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("st%c%s ", c_sz, idxd ? "x" : "" );
1645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Store.src);
1646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCAMode(i->Pin.Store.dst);
1648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_StoreC:
1651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("st%ccx. ", i->Pin.StoreC.sz==4 ? 'w' : 'd');
1652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.StoreC.src);
1653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",%%r0,");
1654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.StoreC.dst);
1655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Set: {
1657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cc = i->Pin.Set.cond;
1658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("set (%s),", showPPCCondCode(cc));
1659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Set.dst);
1660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cc.test == Pct_ALWAYS) {
1661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(": { li ");
1662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.Set.dst);
1663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",1 }");
1664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(": { mfcr r0 ; rlwinm ");
1666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.Set.dst);
1667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",r0,%u,31,31", cc.flag+1);
1668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (cc.test == Pct_FALSE) {
1669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vex_printf("; xori ");
1670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ppHRegPPC(i->Pin.Set.dst);
1671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vex_printf(",");
1672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ppHRegPPC(i->Pin.Set.dst);
1673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vex_printf(",1");
1674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
1675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(" }");
1676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MfCR:
1680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mfcr ");
1681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.MfCR.dst);
1682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MFence:
1684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mfence (=sync)");
1685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpUnary:
1688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCFpOp(i->Pin.FpUnary.op));
1689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpUnary.dst);
1690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpUnary.src);
1692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpBinary:
1694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCFpOp(i->Pin.FpBinary.op));
1695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpBinary.dst);
1696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpBinary.srcL);
1698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpBinary.srcR);
1700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpMulAcc:
1702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCFpOp(i->Pin.FpMulAcc.op));
1703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpMulAcc.dst);
1704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpMulAcc.srcML);
1706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpMulAcc.srcMR);
1708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpMulAcc.srcAcc);
1710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdSt: {
1712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.FpLdSt.sz;
1713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool idxd = toBool(i->Pin.FpLdSt.addr->tag == Pam_RR);
1714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpLdSt.isLoad) {
1715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("lf%c%s ",
1716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (sz==4 ? 's' : 'd'),
1717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    idxd ? "x" : "" );
1718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.FpLdSt.reg);
1719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",");
1720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppPPCAMode(i->Pin.FpLdSt.addr);
1721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("stf%c%s ",
1723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (sz==4 ? 's' : 'd'),
1724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    idxd ? "x" : "" );
1725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.FpLdSt.reg);
1726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",");
1727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppPPCAMode(i->Pin.FpLdSt.addr);
1728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpSTFIW:
1732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("stfiwz ");
1733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpSTFIW.data);
1734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",0(");
1735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpSTFIW.addr);
1736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(")");
1737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpRSP:
1739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("frsp ");
1740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpRSP.dst);
1741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpRSP.src);
1743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCftI: {
1745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      HChar* str = "fc?????";
1746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Note that "fcfids" is missing from below. That instruction would
1747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * satisfy the predicate:
1748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       *    (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False)
1749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * which would go into a final "else" clause to make this if-else
1750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * block balanced.  But we're able to implement fcfids by leveraging
1751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * the fcfid implementation, so it wasn't necessary to include it here.
1752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       */
1753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == False)
1754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True)
1755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fctid";
1756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fctidu";
1758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == True)
1759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True)
1760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fctiw";
1761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fctiwu";
1763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else if (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) {
1764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True) {
1765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fcfid";
1766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
1767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (i->Pin.FpCftI.flt64 == True)
1768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               str = "fcfidu";
1769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
1770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               str = "fcfidus";
1771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
1772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
1773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", str);
1774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCftI.dst);
1775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCftI.src);
1777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCMov:
1780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("fpcmov (%s) ", showPPCCondCode(i->Pin.FpCMov.cond));
1781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCMov.dst);
1782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCMov.src);
1784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(": ");
1785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("if (fr_dst != fr_src) { ");
1786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCMov.cond.test != Pct_ALWAYS) {
1787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("if (%s) { ", showPPCCondCode(i->Pin.FpCMov.cond));
1788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("fmr ");
1790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCMov.dst);
1791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCMov.src);
1793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCMov.cond.test != Pct_ALWAYS)
1794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(" }");
1795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(" }");
1796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdFPSCR:
1798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mtfsf 0xFF,");
1799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpLdFPSCR.src);
1800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",0, %s", i->Pin.FpLdFPSCR.dfp_rm ? "1" : "0");
1801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCmp:
1803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("fcmpo %%cr1,");
1804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.srcL);
1805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.srcR);
1807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("; mfcr ");
1808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.dst);
1809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("; rlwinm ");
1810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.dst);
1811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.dst);
1813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",8,28,31");
1814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_RdWrLR:
1817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", i->Pin.RdWrLR.wrLR ? "mtlr" : "mflr");
1818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.RdWrLR.gpr);
1819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdSt: {
1822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar  sz = i->Pin.AvLdSt.sz;
1823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      HChar* str_size;
1824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvLdSt.addr->tag == Pam_IR) {
1825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppLoadImm(hregPPC_GPR30(mode64),
1826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   i->Pin.AvLdSt.addr->Pam.RR.index, mode64);
1827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(" ; ");
1828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      str_size = sz==1 ? "eb" : sz==2 ? "eh" : sz==4 ? "ew" : "";
1830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvLdSt.isLoad)
1831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("lv%sx ", str_size);
1832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
1833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("stv%sx ", str_size);
1834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvLdSt.reg);
1835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvLdSt.addr->tag == Pam_IR)
1837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("%%r30");
1838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
1839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.AvLdSt.addr->Pam.RR.index);
1840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvLdSt.addr->Pam.RR.base);
1842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUnary:
1845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAvOp(i->Pin.AvUnary.op));
1846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvUnary.dst);
1847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvUnary.src);
1849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBinary:
1851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAvOp(i->Pin.AvBinary.op));
1852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBinary.dst);
1853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBinary.srcL);
1855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBinary.srcR);
1857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin8x16:
1859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s(b) ", showPPCAvOp(i->Pin.AvBin8x16.op));
1860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin8x16.dst);
1861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin8x16.srcL);
1863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin8x16.srcR);
1865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin16x8:
1867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s(h) ", showPPCAvOp(i->Pin.AvBin16x8.op));
1868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin16x8.dst);
1869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin16x8.srcL);
1871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin16x8.srcR);
1873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32x4:
1875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvBin32x4.op));
1876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32x4.dst);
1877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32x4.srcL);
1879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32x4.srcR);
1881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32Fx4:
1883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAvFpOp(i->Pin.AvBin32Fx4.op));
1884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32Fx4.dst);
1885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32Fx4.srcL);
1887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32Fx4.srcR);
1889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUn32Fx4:
1891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAvFpOp(i->Pin.AvUn32Fx4.op));
1892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvUn32Fx4.dst);
1893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvUn32Fx4.src);
1895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvPerm:
1897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vperm ");
1898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvPerm.dst);
1899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvPerm.srcL);
1901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvPerm.srcR);
1903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvPerm.ctl);
1905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSel:
1908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vsel ");
1909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSel.dst);
1910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSel.srcL);
1912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSel.srcR);
1914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSel.ctl);
1916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvShlDbl:
1919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vsldoi ");
1920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvShlDbl.dst);
1921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvShlDbl.srcL);
1923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvShlDbl.srcR);
1925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",%d", i->Pin.AvShlDbl.shift);
1926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSplat: {
1929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.AvSplat.sz;
1930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar ch_sz = toUChar( (sz == 8) ? 'b' : (sz == 16) ? 'h' : 'w' );
1931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vsplt%s%c ",
1932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.AvSplat.src->tag == Pvi_Imm ? "is" : "", ch_sz);
1933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSplat.dst);
1934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCVI5s(i->Pin.AvSplat.src);
1936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvSplat.src->tag == Pvi_Reg)
1937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(", %d", (128/sz)-1);   /* louis lane */
1938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvCMov:
1942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("avcmov (%s) ", showPPCCondCode(i->Pin.AvCMov.cond));
1943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvCMov.dst);
1944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvCMov.src);
1946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(": ");
1947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("if (v_dst != v_src) { ");
1948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvCMov.cond.test != Pct_ALWAYS) {
1949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("if (%s) { ", showPPCCondCode(i->Pin.AvCMov.cond));
1950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vmr ");
1952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvCMov.dst);
1953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvCMov.src);
1955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCMov.cond.test != Pct_ALWAYS)
1956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(" }");
1957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(" }");
1958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdVSCR:
1961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mtvscr ");
1962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvLdVSCR.src);
1963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Unary:
1966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.Dfp64Unary.op));
1967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Unary.dst);
1968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Unary.src);
1970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
1971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Binary:
1973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.Dfp64Binary.op));
1974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Binary.dst);
1975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Binary.srcL);
1977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Binary.srcR);
1979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
1980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift:
1982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpShift.op));
1983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpShift.dst);
1984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpShift.src);
1986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpShift.shift);
1988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
1989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Unary:
1991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.Dfp128Unary.op));
1992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Unary.dst_hi);
1993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Unary.src_hi);
1995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
1996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Binary:
1998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.Dfp128Binary.op));
1999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Binary.dst_hi);
2000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Binary.srcR_hi);
2002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift128:
2005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpShift128.op));
2006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpShift128.dst_hi);
2007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpShift128.src_hi);
2009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpShift128.shift);
2011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound:
2014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("drintx ");
2015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpRound.dst);
2016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpRound.src);
2018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpRound.r_rmc); /*  R in bit 3 and RMC in bits 2:0 */
2020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound128:
2023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("drintxq ");
2024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpRound128.dst_hi);
2025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpRound128.src_hi);
2027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpRound128.r_rmc); /*  R in bit 3 and RMC in bits 2:0 */
2029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize:
2032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpQuantize.op));
2033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize.dst);
2034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize.srcL);
2036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize.srcR);
2038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpQuantize.rmc);
2040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize128:
2043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /*  Dst is used to pass in left source and return result */
2044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("dquaq ");
2045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize128.dst_hi);
2046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize128.dst_hi);
2048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize128.src_hi);
2050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpQuantize128.rmc);
2052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpD128toD64:
2055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpD128toD64.op));
2056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpD128toD64.dst);
2057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpD128toD64.src_hi);
2059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpI64StoD128:
2063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpI64StoD128.op));
2064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpI64StoD128.dst_hi);
2065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpI64StoD128.src);
2067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ExtractExpD128:
2070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("dxexq ");
2071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.ExtractExpD128.dst);
2072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.ExtractExpD128.src_hi);
2074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_InsertExpD128:
2076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("diexq ");
2077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.InsertExpD128.dst_hi);
2078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.InsertExpD128.srcL);
2080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.InsertExpD128.srcR_hi);
2082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Cmp:
2084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("dcmpo %%cr1,");
2085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.srcL);
2086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.srcR);
2088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; mfcr ");
2089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.dst);
2090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; rlwinm ");
2091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.dst);
2092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.dst);
2094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",8,28,31");
2095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Cmp:
2097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("dcmpoq %%cr1,");
2098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.srcL_hi);
2099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.srcR_hi);
2101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; mfcr ");
2102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.dst);
2103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; rlwinm ");
2104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.dst);
2105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.dst);
2107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",8,28,31");
2108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_EvCheck:
2110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Note that the counter dec is 32 bit even in 64-bit mode. */
2111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("(evCheck) ");
2112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("lwz r30,");
2113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.EvCheck.amCounter);
2114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; addic. r30,r30,-1; ");
2115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("stw r30,");
2116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.EvCheck.amCounter);
2117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; bge nofail; lwz r30,");
2118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.EvCheck.amFailAddr);
2119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; mtctr r30; bctr; nofail:");
2120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ProfInc:
2122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (mode64) {
2123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("(profInc) imm64-fixed5 r30,$NotKnownYet; ");
2124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("ld r29,(r30); addi r29,r29,1; std r29,(r30)");
2125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
2126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("(profInc) imm32-fixed2 r30,$NotKnownYet; ");
2127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("lwz r29,4(r30); addic. r29,r29,1; stw r29,4(r30)");
2128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("lwz r29,0(r30); addze r29,r29; stw r29,0(r30)");
2129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
2130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
2131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
2132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("\nppPPCInstr: No such tag(%d)\n", (Int)i->tag);
2133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("ppPPCInstr");
2134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Helpers for register allocation. --------- */
2138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid getRegUsage_PPCInstr ( HRegUsage* u, PPCInstr* i, Bool mode64 )
2140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   initHRegUsage(u);
2142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (i->tag) {
2143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LI:
2144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.LI.dst);
2145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
2146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Alu:
2147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Alu.srcL);
2148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCRH(u,    i->Pin.Alu.srcR);
2149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Alu.dst);
2150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Shft:
2152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Shft.srcL);
2153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCRH(u,    i->Pin.Shft.srcR);
2154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Shft.dst);
2155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AddSubC:
2157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AddSubC.dst);
2158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AddSubC.srcL);
2159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AddSubC.srcR);
2160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Cmp:
2162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.Cmp.srcL);
2163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCRH(u,   i->Pin.Cmp.srcR);
2164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Unary:
2166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Unary.dst);
2167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Unary.src);
2168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MulL:
2170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.MulL.dst);
2171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.MulL.srcL);
2172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.MulL.srcR);
2173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Div:
2175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Div.dst);
2176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Div.srcL);
2177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Div.srcR);
2178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Call: {
2180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt argir;
2181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* This is a bit subtle. */
2182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* First off, claim it trashes all the caller-saved regs
2183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         which fall within the register allocator's jurisdiction.
2184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         These I believe to be:
2185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         mode32: r3 to r12
2186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         mode64: r3 to r10
2187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
2188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* XXXXXXXXXXXXXXXXX BUG! This doesn't say anything about the FP
2189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         or Altivec registers.  We get away with this ONLY because
2190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         getAllocatableRegs_PPC gives the allocator callee-saved fp
2191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         and Altivec regs, and no caller-save ones. */
2192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR3(mode64));
2193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR4(mode64));
2194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR5(mode64));
2195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR6(mode64));
2196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR7(mode64));
2197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR8(mode64));
2198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR9(mode64));
2199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR10(mode64));
2200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64) {
2201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, hregPPC_GPR11(mode64));
2202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, hregPPC_GPR12(mode64));
2203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Now we have to state any parameter-carrying registers
2206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         which might be read.  This depends on the argiregs field. */
2207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      argir = i->Pin.Call.argiregs;
2208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir &(1<<10)) addHRegUse(u, HRmRead, hregPPC_GPR10(mode64));
2209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<9)) addHRegUse(u, HRmRead, hregPPC_GPR9(mode64));
2210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<8)) addHRegUse(u, HRmRead, hregPPC_GPR8(mode64));
2211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<7)) addHRegUse(u, HRmRead, hregPPC_GPR7(mode64));
2212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<6)) addHRegUse(u, HRmRead, hregPPC_GPR6(mode64));
2213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<5)) addHRegUse(u, HRmRead, hregPPC_GPR5(mode64));
2214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<4)) addHRegUse(u, HRmRead, hregPPC_GPR4(mode64));
2215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<3)) addHRegUse(u, HRmRead, hregPPC_GPR3(mode64));
2216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(0 == (argir & ~((1<<3)|(1<<4)|(1<<5)|(1<<6)
2218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              |(1<<7)|(1<<8)|(1<<9)|(1<<10))));
2219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Finally, there is the issue that the insn trashes a
2221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         register because the literal target address has to be
2222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         loaded into a register.  %r10 seems a suitable victim.
2223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (Can't use %r0, as some insns interpret it as value zero). */
2224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR10(mode64));
2225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Upshot of this is that the assembler really must use %r10,
2226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         and no other, as a destination temporary. */
2227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* XDirect/XIndir/XAssisted are also a bit subtle.  They
2230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      conditionally exit the block.  Hence we only need to list (1)
2231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      the registers that they read, and (2) the registers that they
2232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      write in the case where the block is not exited.  (2) is empty,
2233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      hence only (1) is relevant here. */
2234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XDirect:
2235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.XDirect.amCIA);
2236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XIndir:
2238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.XIndir.dstGA);
2239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.XIndir.amCIA);
2240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XAssisted:
2242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.XAssisted.dstGA);
2243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.XAssisted.amCIA);
2244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_CMov:
2246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCRI(u,  i->Pin.CMov.src);
2247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.CMov.dst);
2248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Load:
2250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCAMode(u, i->Pin.Load.src);
2251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Load.dst);
2252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LoadL:
2254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.LoadL.src);
2255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.LoadL.dst);
2256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Store:
2258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Store.src);
2259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCAMode(u, i->Pin.Store.dst);
2260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_StoreC:
2262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.StoreC.src);
2263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.StoreC.dst);
2264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Set:
2266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Set.dst);
2267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MfCR:
2269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.MfCR.dst);
2270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MFence:
2272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpUnary:
2275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpUnary.dst);
2276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpUnary.src);
2277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpBinary:
2279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpBinary.dst);
2280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpBinary.srcL);
2281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpBinary.srcR);
2282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpMulAcc:
2284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpMulAcc.dst);
2285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpMulAcc.srcML);
2286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpMulAcc.srcMR);
2287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpMulAcc.srcAcc);
2288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdSt:
2290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, (i->Pin.FpLdSt.isLoad ? HRmWrite : HRmRead),
2291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.FpLdSt.reg);
2292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCAMode(u, i->Pin.FpLdSt.addr);
2293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpSTFIW:
2295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.FpSTFIW.addr);
2296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.FpSTFIW.data);
2297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpRSP:
2299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpRSP.dst);
2300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpRSP.src);
2301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCftI:
2303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpCftI.dst);
2304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpCftI.src);
2305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCMov:
2307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmModify, i->Pin.FpCMov.dst);
2308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,   i->Pin.FpCMov.src);
2309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdFPSCR:
2311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.FpLdFPSCR.src);
2312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCmp:
2314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpCmp.dst);
2315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpCmp.srcL);
2316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpCmp.srcR);
2317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_RdWrLR:
2320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, (i->Pin.RdWrLR.wrLR ? HRmRead : HRmWrite),
2321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.RdWrLR.gpr);
2322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdSt:
2325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, (i->Pin.AvLdSt.isLoad ? HRmWrite : HRmRead),
2326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.AvLdSt.reg);
2327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvLdSt.addr->tag == Pam_IR)
2328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64));
2329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCAMode(u, i->Pin.AvLdSt.addr);
2330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUnary:
2332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvUnary.dst);
2333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvUnary.src);
2334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBinary:
2336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvBinary.op == Pav_XOR
2337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          && i->Pin.AvBinary.dst == i->Pin.AvBinary.srcL
2338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          && i->Pin.AvBinary.dst == i->Pin.AvBinary.srcR) {
2339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* reg-alloc needs to understand 'xor r,r,r' as a write of r */
2340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* (as opposed to a rite of passage :-) */
2341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, i->Pin.AvBinary.dst);
2342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
2343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, i->Pin.AvBinary.dst);
2344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmRead,  i->Pin.AvBinary.srcL);
2345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmRead,  i->Pin.AvBinary.srcR);
2346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin8x16:
2349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvBin8x16.dst);
2350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin8x16.srcL);
2351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin8x16.srcR);
2352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin16x8:
2354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvBin16x8.dst);
2355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin16x8.srcL);
2356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin16x8.srcR);
2357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32x4:
2359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvBin32x4.dst);
2360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin32x4.srcL);
2361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin32x4.srcR);
2362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32Fx4:
2364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvBin32Fx4.dst);
2365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin32Fx4.srcL);
2366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin32Fx4.srcR);
2367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvBin32Fx4.op == Pavfp_MULF)
2368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, hregPPC_VR29());
2369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUn32Fx4:
2371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvUn32Fx4.dst);
2372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvUn32Fx4.src);
2373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvPerm:
2375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvPerm.dst);
2376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvPerm.srcL);
2377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvPerm.srcR);
2378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvPerm.ctl);
2379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSel:
2381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvSel.dst);
2382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvSel.ctl);
2383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvSel.srcL);
2384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvSel.srcR);
2385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvShlDbl:
2387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvShlDbl.dst);
2388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvShlDbl.srcL);
2389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvShlDbl.srcR);
2390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSplat:
2392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvSplat.dst);
2393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCVI5s(u,  i->Pin.AvSplat.src);
2394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvCMov:
2396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmModify, i->Pin.AvCMov.dst);
2397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,   i->Pin.AvCMov.src);
2398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdVSCR:
2400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.AvLdVSCR.src);
2401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Unary:
2403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp64Unary.dst);
2404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp64Unary.src);
2405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Binary:
2407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp64Binary.dst);
2408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp64Binary.srcL);
2409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp64Binary.srcR);
2410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift:
2412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCRI(u,    i->Pin.DfpShift.shift);
2413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift.src);
2414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift.dst);
2415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Unary:
2417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Unary.dst_hi);
2418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Unary.dst_lo);
2419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Unary.src_hi);
2420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Unary.src_lo);
2421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Binary:
2423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Binary.dst_hi);
2424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Binary.dst_lo);
2425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp128Binary.srcR_hi);
2426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp128Binary.srcR_lo);
2427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound:
2429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpRound.dst);
2430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpRound.src);
2431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound128:
2433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpRound128.dst_hi);
2434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpRound128.dst_lo);
2435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpRound128.src_hi);
2436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpRound128.src_lo);
2437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize:
2439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCRI(u,  i->Pin.DfpQuantize.rmc);
2440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpQuantize.dst);
2441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpQuantize.srcL);
2442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpQuantize.srcR);
2443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize128:
2445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpQuantize128.dst_hi);
2446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpQuantize128.dst_lo);
2447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpQuantize128.src_hi);
2448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpQuantize128.src_lo);
2449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift128:
2451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCRI(u,    i->Pin.DfpShift128.shift);
2452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift128.src_hi);
2453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift128.src_lo);
2454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift128.dst_hi);
2455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift128.dst_lo);
2456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpD128toD64:
2458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.src_hi);
2459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.src_lo);
2460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.dst);
2461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpI64StoD128:
2463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.src);
2464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.dst_hi);
2465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.dst_lo);
2466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ExtractExpD128:
2468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.ExtractExpD128.dst);
2469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.ExtractExpD128.src_hi);
2470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.ExtractExpD128.src_lo);
2471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_InsertExpD128:
2473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.InsertExpD128.dst_hi);
2474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.InsertExpD128.dst_lo);
2475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.InsertExpD128.srcL);
2476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.InsertExpD128.srcR_hi);
2477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.InsertExpD128.srcR_lo);
2478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Cmp:
2480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp64Cmp.dst);
2481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp64Cmp.srcL);
2482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp64Cmp.srcR);
2483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Cmp:
2485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Cmp.dst);
2486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Cmp.srcL_hi);
2487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Cmp.srcL_lo);
2488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Cmp.srcR_hi);
2489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Cmp.srcR_lo);
2490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_EvCheck:
2492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We expect both amodes only to mention the GSP (r31), so this
2493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         is in fact pointless, since GSP isn't allocatable, but
2494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         anyway.. */
2495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.EvCheck.amCounter);
2496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.EvCheck.amFailAddr);
2497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64)); /* also unavail to RA */
2498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ProfInc:
2500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, hregPPC_GPR29(mode64));
2501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64));
2502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
2504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCInstr(i, mode64);
2505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("getRegUsage_PPCInstr");
2506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* local helper */
2510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapReg( HRegRemap* m, HReg* r )
2511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *r = lookupHRegRemap(m, *r);
2513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid mapRegs_PPCInstr ( HRegRemap* m, PPCInstr* i, Bool mode64 )
2516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (i->tag) {
2518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LI:
2519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.LI.dst);
2520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Alu:
2522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Alu.dst);
2523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Alu.srcL);
2524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCRH(m, i->Pin.Alu.srcR);
2525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Shft:
2527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Shft.dst);
2528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Shft.srcL);
2529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCRH(m, i->Pin.Shft.srcR);
2530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AddSubC:
2532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AddSubC.dst);
2533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AddSubC.srcL);
2534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AddSubC.srcR);
2535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Cmp:
2537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Cmp.srcL);
2538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCRH(m, i->Pin.Cmp.srcR);
2539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Unary:
2541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Unary.dst);
2542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Unary.src);
2543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MulL:
2545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.MulL.dst);
2546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.MulL.srcL);
2547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.MulL.srcR);
2548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Div:
2550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Div.dst);
2551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Div.srcL);
2552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Div.srcR);
2553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Call:
2555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XDirect:
2557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.XDirect.amCIA);
2558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XIndir:
2560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.XIndir.dstGA);
2561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.XIndir.amCIA);
2562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XAssisted:
2564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.XAssisted.dstGA);
2565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.XAssisted.amCIA);
2566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_CMov:
2568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCRI(m, i->Pin.CMov.src);
2569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.CMov.dst);
2570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Load:
2572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCAMode(m, i->Pin.Load.src);
2573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Load.dst);
2574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LoadL:
2576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.LoadL.src);
2577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.LoadL.dst);
2578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Store:
2580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Store.src);
2581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCAMode(m, i->Pin.Store.dst);
2582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_StoreC:
2584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.StoreC.src);
2585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.StoreC.dst);
2586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Set:
2588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Set.dst);
2589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MfCR:
2591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.MfCR.dst);
2592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MFence:
2594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpUnary:
2596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpUnary.dst);
2597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpUnary.src);
2598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpBinary:
2600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpBinary.dst);
2601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpBinary.srcL);
2602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpBinary.srcR);
2603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpMulAcc:
2605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpMulAcc.dst);
2606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpMulAcc.srcML);
2607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpMulAcc.srcMR);
2608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpMulAcc.srcAcc);
2609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdSt:
2611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpLdSt.reg);
2612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCAMode(m, i->Pin.FpLdSt.addr);
2613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpSTFIW:
2615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpSTFIW.addr);
2616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpSTFIW.data);
2617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpRSP:
2619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpRSP.dst);
2620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpRSP.src);
2621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCftI:
2623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCftI.dst);
2624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCftI.src);
2625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCMov:
2627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCMov.dst);
2628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCMov.src);
2629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdFPSCR:
2631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpLdFPSCR.src);
2632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCmp:
2634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCmp.dst);
2635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCmp.srcL);
2636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCmp.srcR);
2637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_RdWrLR:
2639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.RdWrLR.gpr);
2640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdSt:
2642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvLdSt.reg);
2643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCAMode(m, i->Pin.AvLdSt.addr);
2644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUnary:
2646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvUnary.dst);
2647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvUnary.src);
2648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBinary:
2650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBinary.dst);
2651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBinary.srcL);
2652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBinary.srcR);
2653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin8x16:
2655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin8x16.dst);
2656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin8x16.srcL);
2657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin8x16.srcR);
2658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin16x8:
2660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin16x8.dst);
2661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin16x8.srcL);
2662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin16x8.srcR);
2663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32x4:
2665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32x4.dst);
2666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32x4.srcL);
2667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32x4.srcR);
2668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32Fx4:
2670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32Fx4.dst);
2671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32Fx4.srcL);
2672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32Fx4.srcR);
2673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUn32Fx4:
2675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvUn32Fx4.dst);
2676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvUn32Fx4.src);
2677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvPerm:
2679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvPerm.dst);
2680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvPerm.srcL);
2681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvPerm.srcR);
2682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvPerm.ctl);
2683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSel:
2685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSel.dst);
2686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSel.srcL);
2687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSel.srcR);
2688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSel.ctl);
2689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvShlDbl:
2691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvShlDbl.dst);
2692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvShlDbl.srcL);
2693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvShlDbl.srcR);
2694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSplat:
2696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSplat.dst);
2697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCVI5s(m, i->Pin.AvSplat.src);
2698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvCMov:
2700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     mapReg(m, &i->Pin.AvCMov.dst);
2701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     mapReg(m, &i->Pin.AvCMov.src);
2702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     return;
2703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdVSCR:
2704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvLdVSCR.src);
2705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Unary:
2707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Unary.dst);
2708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Unary.src);
2709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Binary:
2711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Binary.dst);
2712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Binary.srcL);
2713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Binary.srcR);
2714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift:
2716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCRI(m, i->Pin.DfpShift.shift);
2717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift.src);
2718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift.dst);
2719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Unary:
2721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Unary.dst_hi);
2722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Unary.dst_lo);
2723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Unary.src_hi);
2724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Unary.src_lo);
2725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     return;
2726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Binary:
2727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Binary.dst_hi);
2728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Binary.dst_lo);
2729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Binary.srcR_hi);
2730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Binary.srcR_lo);
2731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift128:
2733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCRI(m, i->Pin.DfpShift128.shift);
2734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift128.src_hi);
2735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift128.src_lo);
2736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift128.dst_hi);
2737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift128.dst_lo);
2738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound:
2740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound.dst);
2741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound.src);
2742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound128:
2744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound128.dst_hi);
2745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound128.dst_lo);
2746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound128.src_hi);
2747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound128.src_lo);
2748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize:
2750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCRI(m, i->Pin.DfpQuantize.rmc);
2751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize.dst);
2752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize.srcL);
2753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize.srcR);
2754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize128:
2756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCRI(m, i->Pin.DfpQuantize128.rmc);
2757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize128.dst_hi);
2758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize128.dst_lo);
2759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize128.src_hi);
2760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize128.src_lo);
2761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpD128toD64:
2763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpD128toD64.src_hi);
2764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpD128toD64.src_lo);
2765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpD128toD64.dst);
2766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpI64StoD128:
2768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpI64StoD128.src);
2769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpI64StoD128.dst_hi);
2770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpI64StoD128.dst_lo);
2771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ExtractExpD128:
2773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.ExtractExpD128.dst);
2774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.ExtractExpD128.src_hi);
2775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.ExtractExpD128.src_lo);
2776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_InsertExpD128:
2778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.dst_hi);
2779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.dst_lo);
2780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.srcL);
2781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.srcR_hi);
2782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.srcR_lo);
2783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Cmp:
2785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Cmp.dst);
2786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Cmp.srcL);
2787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Cmp.srcR);
2788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Cmp:
2790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.dst);
2791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.srcL_hi);
2792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.srcL_lo);
2793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.srcR_hi);
2794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.srcR_lo);
2795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_EvCheck:
2797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We expect both amodes only to mention the GSP (r31), so this
2798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         is in fact pointless, since GSP isn't allocatable, but
2799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         anyway.. */
2800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.EvCheck.amCounter);
2801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.EvCheck.amFailAddr);
2802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ProfInc:
2804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* hardwires r29 and r30 -- nothing to modify. */
2805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
2807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCInstr(i, mode64);
2808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("mapRegs_PPCInstr");
2809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Figure out if i represents a reg-reg move, and if so assign the
2813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   source and destination to *src and *dst.  If in doubt say No.  Used
2814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   by the register allocator to do move coalescing.
2815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
2816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool isMove_PPCInstr ( PPCInstr* i, HReg* src, HReg* dst )
2817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Moves between integer regs */
2819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (i->tag == Pin_Alu) {
2820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // or Rd,Rs,Rs == mr Rd,Rs
2821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Alu.op != Palu_OR)
2822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return False;
2823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Alu.srcR->tag != Prh_Reg)
2824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return False;
2825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Alu.srcR->Prh.Reg.reg != i->Pin.Alu.srcL)
2826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return False;
2827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *src = i->Pin.Alu.srcL;
2828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *dst = i->Pin.Alu.dst;
2829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
2830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Moves between FP regs */
2832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (i->tag == Pin_FpUnary) {
2833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpUnary.op != Pfp_MOV)
2834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return False;
2835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *src = i->Pin.FpUnary.src;
2836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *dst = i->Pin.FpUnary.dst;
2837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
2838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return False;
2840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Generate ppc spill/reload instructions under the direction of the
2844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register allocator.  Note it's critical these don't write the
2845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   condition codes. */
2846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid genSpill_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
2848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    HReg rreg, Int offsetB, Bool mode64 )
2849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAMode* am;
2851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(rreg));
2852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *i1 = *i2 = NULL;
2853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am = PPCAMode_IR( offsetB, GuestStatePtr(mode64) );
2854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (hregClass(rreg)) {
2855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcInt64:
2856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
2857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_Store( 8, am, rreg, mode64 );
2858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
2859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcInt32:
2860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(!mode64);
2861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_Store( 4, am, rreg, mode64 );
2862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
2863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcFlt64:
2864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_FpLdSt ( False/*store*/, 8, rreg, am );
2865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
2866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcVec128:
2867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // XXX: GPR30 used as spill register to kludge AltiVec
2868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // AMode_IR
2869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_AvLdSt ( False/*store*/, 16, rreg, am );
2870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
2871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
2872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegClass(hregClass(rreg));
2873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("genSpill_PPC: unimplemented regclass");
2874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
2878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     HReg rreg, Int offsetB, Bool mode64 )
2879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAMode* am;
2881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(rreg));
2882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *i1 = *i2 = NULL;
2883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am = PPCAMode_IR( offsetB, GuestStatePtr(mode64) );
2884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (hregClass(rreg)) {
2885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcInt64:
2886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
2887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_Load( 8, rreg, am, mode64 );
2888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
2889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcInt32:
2890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(!mode64);
2891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_Load( 4, rreg, am, mode64 );
2892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
2893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcFlt64:
2894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_FpLdSt ( True/*load*/, 8, rreg, am );
2895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
2896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcVec128:
2897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // XXX: GPR30 used as spill register to kludge AltiVec AMode_IR
2898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_AvLdSt ( True/*load*/, 16, rreg, am );
2899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
2900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
2901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegClass(hregClass(rreg));
2902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("genReload_PPC: unimplemented regclass");
2903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- The ppc assembler (bleh.) --------- */
2908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt iregNo ( HReg r, Bool mode64 )
2910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt n;
2912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(hregClass(r) == mode64 ? HRcInt64 : HRcInt32);
2913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(r));
2914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   n = hregNumber(r);
2915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(n <= 32);
2916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return n;
2917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt fregNo ( HReg fr )
2920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt n;
2922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(hregClass(fr) == HRcFlt64);
2923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(fr));
2924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   n = hregNumber(fr);
2925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(n <= 32);
2926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return n;
2927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt vregNo ( HReg v )
2930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt n;
2932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(hregClass(v) == HRcVec128);
2933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(v));
2934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   n = hregNumber(v);
2935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(n <= 32);
2936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return n;
2937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Emit an instruction big-endianly */
2940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* emit32 ( UChar* p, UInt w32 )
2941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *p++ = toUChar((w32 >> 24) & 0x000000FF);
2943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *p++ = toUChar((w32 >> 16) & 0x000000FF);
2944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *p++ = toUChar((w32 >>  8) & 0x000000FF);
2945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *p++ = toUChar((w32)       & 0x000000FF);
2946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
2947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Fetch an instruction big-endianly */
2950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt fetch32 ( UChar* p )
2951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
2952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt w32 = 0;
2953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w32 |= ((0xFF & (UInt)p[0]) << 24);
2954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w32 |= ((0xFF & (UInt)p[1]) << 16);
2955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w32 |= ((0xFF & (UInt)p[2]) <<  8);
2956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w32 |= ((0xFF & (UInt)p[3]) <<  0);
2957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return w32;
2958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
2959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The following mkForm[...] functions refer to ppc instruction forms
2961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   as per PPC32 p576
2962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
2963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormD ( UChar* p, UInt opc1,
2965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt r1, UInt r2, UInt imm )
2966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
2968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
2969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
2970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
2971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   imm = imm & 0xFFFF;
2972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (imm));
2973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
2974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormMD ( UChar* p, UInt opc1, UInt r1, UInt r2,
2977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt imm1, UInt imm2, UInt opc2 )
2978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
2980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
2981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
2982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
2983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(imm1 < 0x40);
2984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(imm2 < 0x40);
2985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x08);
2986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   imm2 = ((imm2 & 0x1F) << 1) | (imm2 >> 5);
2987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
2988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               ((imm1 & 0x1F)<<11) | (imm2<<5) |
2989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (opc2<<2) | ((imm1 >> 5)<<1));
2990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
2991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormX ( UChar* p, UInt opc1, UInt r1, UInt r2,
2994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt r3, UInt opc2, UInt b0 )
2995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
2997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
2998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
2999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2);
3003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r3<<11) | (opc2<<1) | (b0));
3005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXO ( UChar* p, UInt opc1, UInt r1, UInt r2,
3009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt r3, UInt b10, UInt opc2, UInt b0 )
3010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b10  < 0x2);
3017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x200);
3018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2);
3019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r3<<11) | (b10 << 10) | (opc2<<1) | (b0));
3021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXL ( UChar* p, UInt opc1, UInt f1, UInt f2,
3025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt f3, UInt opc2, UInt b0 )
3026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f1   < 0x20);
3030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f2   < 0x20);
3031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f3   < 0x20);
3032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2);
3034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (f1<<21) | (f2<<16) |
3035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (f3<<11) | (opc2<<1) | (b0));
3036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Note: for split field ops, give mnemonic arg
3040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXFX ( UChar* p, UInt r1, UInt f2, UInt opc2 )
3041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f2   < 0x20);
3045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (opc2) {
3047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 144:  // mtcrf
3048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(f2 < 0x100);
3049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      f2 = f2 << 1;
3050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 339:  // mfspr
3052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 371:  // mftb
3053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 467:  // mtspr
3054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(f2 < 0x400);
3055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // re-arrange split field
3056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      f2 = ((f2>>5) & 0x1F) | ((f2 & 0x1F)<<5);
3057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default: vpanic("mkFormXFX(ppch)");
3059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((31<<26) | (r1<<21) | (f2<<11) | (opc2<<1));
3061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Only used by mtfsf
3065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormXFL ( UChar* p, UInt FM, UInt freg, UInt dfp_rm )
3066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(FM   < 0x100);
3069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(freg < 0x20);
3070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   theInstr = ((63<<26) | (FM<<17) | (dfp_rm<<16) | (freg<<11) | (711<<1));
3071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXS ( UChar* p, UInt opc1, UInt r1, UInt r2,
3075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt imm, UInt opc2, UInt b0 )
3076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(imm  < 0x40);
3082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2);
3084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               ((imm & 0x1F)<<11) | (opc2<<2) | ((imm>>5)<<1) | (b0));
3086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
3091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'b'
3092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormI ( UChar* p, UInt LI, UInt AA, UInt LK )
3093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(LI  < 0x1000000);
3096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(AA  < 0x2);
3097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(LK  < 0x2);
3098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((18<<26) | (LI<<2) | (AA<<1) | (LK));
3099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'bc'
3104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormB ( UChar* p, UInt BO, UInt BI,
3105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt BD, UInt AA, UInt LK )
3106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(BO  < 0x20);
3109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(BI  < 0x20);
3110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(BD  < 0x4000);
3111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(AA  < 0x2);
3112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(LK  < 0x2);
3113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((16<<26) | (BO<<21) | (BI<<16) |
3114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (BD<<2) | (AA<<1) | (LK));
3115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// rotates
3119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormM ( UChar* p, UInt opc1, UInt r1, UInt r2,
3120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt f3, UInt MB, UInt ME, UInt Rc )
3121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f3   < 0x20);
3127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(MB   < 0x20);
3128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(ME   < 0x20);
3129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(Rc   < 0x2);
3130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (f3<<11) | (MB<<6) | (ME<<1) | (Rc));
3132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormA ( UChar* p, UInt opc1, UInt r1, UInt r2,
3136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt r3, UInt r4, UInt opc2, UInt b0 )
3137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r4   < 0x20);
3144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x20);
3145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2 );
3146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (r3<<11) |
3147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r4<<6) | (opc2<<1) | (b0));
3148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormZ22 ( UChar* p, UInt opc1, UInt r1, UInt r2,
3152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                          UInt constant, UInt opc2, UInt b0 )
3153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt theInstr;
3155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(opc1     < 0x40);
3156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r1       < 0x20);
3157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r2       < 0x20);
3158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(constant < 0x40);   /* 6 bit constant */
3159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(opc2     < 0x200);  /* 9 bit field */
3160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(b0       < 0x2);
3161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               (constant<<10) | (opc2<<1) | (b0));
3163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return emit32(p, theInstr);
3164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormZ23 ( UChar* p, UInt opc1, UInt r1, UInt r2,
3167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                          UInt r3, UInt rmc, UInt opc2, UInt b0 )
3168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt theInstr;
3170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(opc1 < 0x40);
3171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r1   < 0x20);
3172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r2   < 0x20);
3173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r3   < 0x20);
3174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(rmc  < 0x4);
3175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(opc2 < 0x100);
3176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(b0   < 0x2);
3177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               (r3<<11) | (rmc<<9) | (opc2<<1) | (b0));
3179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return emit32(p, theInstr);
3180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* doAMode_IR ( UChar* p, UInt opc1, UInt rSD,
3183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           PPCAMode* am, Bool mode64 )
3184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt rA, idx;
3186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(am->tag == Pam_IR);
3187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(am->Pam.IR.index < 0x10000);
3188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rA  = iregNo(am->Pam.IR.base, mode64);
3190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   idx = am->Pam.IR.index;
3191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (opc1 == 58 || opc1 == 62) { // ld/std: mode64 only
3193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(mode64);
3194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* stay sane with DS form: lowest 2 bits must be 00.  This
3195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         should be guaranteed to us by iselWordExpr_AMode. */
3196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(0 == (idx & 3));
3197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p = mkFormD(p, opc1, rSD, rA, idx);
3199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
3200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* doAMode_RR ( UChar* p, UInt opc1, UInt opc2,
3203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           UInt rSD, PPCAMode* am, Bool mode64 )
3204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt rA, rB;
3206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(am->tag == Pam_RR);
3207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rA  = iregNo(am->Pam.RR.base, mode64);
3209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rB  = iregNo(am->Pam.RR.index, mode64);
3210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p = mkFormX(p, opc1, rSD, rA, rB, opc2, 0);
3212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
3213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Load imm to r_dst */
3217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkLoadImm ( UChar* p, UInt r_dst, ULong imm, Bool mode64 )
3218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r_dst < 0x20);
3220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!mode64) {
3222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* In 32-bit mode, make sure the top 32 bits of imm are a sign
3223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         extension of the bottom 32 bits, so that the range tests
3224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         below work correctly. */
3225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt u32 = (UInt)imm;
3226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int  s32 = (Int)u32;
3227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Long s64 = (Long)s32;
3228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      imm = (ULong)s64;
3229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (imm >= 0xFFFFFFFFFFFF8000ULL || imm < 0x8000) {
3232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // sign-extendable from 16 bits
3233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // addi r_dst,0,imm  => li r_dst,imm
3235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormD(p, 14, r_dst, 0, imm & 0xFFFF);
3236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
3237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (imm >= 0xFFFFFFFF80000000ULL || imm < 0x80000000ULL) {
3238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // sign-extendable from 32 bits
3239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16)
3241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF);
3242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // ori r_dst, r_dst, (imm & 0xFFFF)
3243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
3245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // full 64bit immediate load: 5 (five!) insns.
3246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
3247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load high word
3249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // lis r_dst, (imm>>48) & 0xFFFF
3251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF);
3252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // ori r_dst, r_dst, (imm>>32) & 0xFFFF
3254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if ((imm>>32) & 0xFFFF)
3255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF);
3256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // shift r_dst low word to high word => rldicr
3258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1);
3259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load low word
3261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // oris r_dst, r_dst, (imm>>16) & 0xFFFF
3263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if ((imm>>16) & 0xFFFF)
3264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF);
3265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // ori r_dst, r_dst, (imm) & 0xFFFF
3267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (imm & 0xFFFF)
3268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
3272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A simplified version of mkLoadImm that always generates 2 or 5
3275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   instructions (32 or 64 bits respectively) even if it could generate
3276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   fewer.  This is needed for generating fixed sized patchable
3277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   sequences. */
3278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkLoadImm_EXACTLY2or5 ( UChar* p,
3279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      UInt r_dst, ULong imm, Bool mode64 )
3280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r_dst < 0x20);
3282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!mode64) {
3284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* In 32-bit mode, make sure the top 32 bits of imm are a sign
3285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         extension of the bottom 32 bits.  (Probably unnecessary.) */
3286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt u32 = (UInt)imm;
3287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Int  s32 = (Int)u32;
3288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Long s64 = (Long)s32;
3289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      imm = (ULong)s64;
3290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!mode64) {
3293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16)
3294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF);
3295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm & 0xFFFF)
3296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
3299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // full 64bit immediate load: 5 (five!) insns.
3300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // load high word
3302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // lis r_dst, (imm>>48) & 0xFFFF
3303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF);
3304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm>>32) & 0xFFFF
3306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF);
3307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // shift r_dst low word to high word => rldicr
3309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1);
3310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // load low word
3312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // oris r_dst, r_dst, (imm>>16) & 0xFFFF
3313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF);
3314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm) & 0xFFFF
3316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return p;
3319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Checks whether the sequence of bytes at p was indeed created
3322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   by mkLoadImm_EXACTLY2or5 with the given parameters. */
3323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool isLoadImm_EXACTLY2or5 ( UChar* p_to_check,
3324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    UInt r_dst, ULong imm, Bool mode64 )
3325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r_dst < 0x20);
3327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!mode64) {
3329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* In 32-bit mode, make sure the top 32 bits of imm are a sign
3330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         extension of the bottom 32 bits.  (Probably unnecessary.) */
3331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt u32 = (UInt)imm;
3332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Int  s32 = (Int)u32;
3333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Long s64 = (Long)s32;
3334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      imm = (ULong)s64;
3335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!mode64) {
3338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt   expect[2] = { 0, 0 };
3339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* p         = (UChar*)&expect[0];
3340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16)
3341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF);
3342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm & 0xFFFF)
3343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(p == (UChar*)&expect[2]);
3345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return fetch32(p_to_check + 0) == expect[0]
3347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 4) == expect[1];
3348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
3350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt   expect[5] = { 0, 0, 0, 0, 0 };
3351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* p         = (UChar*)&expect[0];
3352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // full 64bit immediate load: 5 (five!) insns.
3353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // load high word
3355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // lis r_dst, (imm>>48) & 0xFFFF
3356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF);
3357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm>>32) & 0xFFFF
3359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF);
3360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // shift r_dst low word to high word => rldicr
3362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1);
3363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // load low word
3365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // oris r_dst, r_dst, (imm>>16) & 0xFFFF
3366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF);
3367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm) & 0xFFFF
3369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(p == (UChar*)&expect[5]);
3372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return fetch32(p_to_check + 0) == expect[0]
3374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 4) == expect[1]
3375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 8) == expect[2]
3376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 12) == expect[3]
3377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 16) == expect[4];
3378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a machine-word sized load or store.  Simplified version of
3383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   the Pin_Load and Pin_Store cases below. */
3384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* do_load_or_store_machine_word (
3385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UChar* p, Bool isLoad,
3386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UInt reg, PPCAMode* am, Bool mode64 )
3387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (isLoad) {
3389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt opc1, sz = mode64 ? 8 : 4;
3390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (am->tag) {
3391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_IR:
3392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (mode64) {
3393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               vassert(0 == (am->Pam.IR.index & 3));
3394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            switch (sz) {
3396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 4:  opc1 = 32; vassert(!mode64); break;
3397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 8:  opc1 = 58; vassert(mode64);  break;
3398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default: vassert(0);
3399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            p = doAMode_IR(p, opc1, reg, am, mode64);
3401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
3402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_RR:
3403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* we could handle this case, but we don't expect to ever
3404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               need to. */
3405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
3407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
3409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else /*store*/ {
3410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt opc1, sz = mode64 ? 8 : 4;
3411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (am->tag) {
3412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_IR:
3413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (mode64) {
3414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               vassert(0 == (am->Pam.IR.index & 3));
3415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            switch (sz) {
3417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 4:  opc1 = 36; vassert(!mode64); break;
3418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 8:  opc1 = 62; vassert(mode64);  break;
3419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default: vassert(0);
3420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            p = doAMode_IR(p, opc1, reg, am, mode64);
3422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
3423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_RR:
3424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* we could handle this case, but we don't expect to ever
3425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               need to. */
3426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
3428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
3430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return p;
3432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a 32-bit sized load or store.  Simplified version of
3435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_load_or_store_machine_word above. */
3436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* do_load_or_store_word32 (
3437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UChar* p, Bool isLoad,
3438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UInt reg, PPCAMode* am, Bool mode64 )
3439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (isLoad) {
3441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt opc1;
3442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (am->tag) {
3443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_IR:
3444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (mode64) {
3445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               vassert(0 == (am->Pam.IR.index & 3));
3446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            opc1 = 32;
3448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            p = doAMode_IR(p, opc1, reg, am, mode64);
3449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
3450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_RR:
3451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* we could handle this case, but we don't expect to ever
3452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               need to. */
3453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
3455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
3457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else /*store*/ {
3458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt opc1;
3459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (am->tag) {
3460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_IR:
3461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (mode64) {
3462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               vassert(0 == (am->Pam.IR.index & 3));
3463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            opc1 = 36;
3465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            p = doAMode_IR(p, opc1, reg, am, mode64);
3466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
3467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_RR:
3468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* we could handle this case, but we don't expect to ever
3469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               need to. */
3470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
3472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
3474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return p;
3476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Move r_dst to r_src */
3479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkMoveReg ( UChar* p, UInt r_dst, UInt r_src )
3480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r_dst < 0x20);
3482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r_src < 0x20);
3483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (r_dst != r_src) {
3485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* or r_dst, r_src, r_src */
3486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, r_src, r_dst, r_src, 444, 0 );
3487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
3489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVX ( UChar* p, UInt opc1, UInt r1, UInt r2,
3492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt r3, UInt opc2 )
3493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x800);
3500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (r3<<11) | opc2);
3501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVXR ( UChar* p, UInt opc1, UInt r1, UInt r2,
3505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          UInt r3, UInt Rc, UInt opc2 )
3506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(Rc   < 0x2);
3513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r3<<11) | (Rc<<10) | opc2);
3516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVA ( UChar* p, UInt opc1, UInt r1, UInt r2,
3520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt r3, UInt r4, UInt opc2 )
3521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r4   < 0x20);
3528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x40);
3529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r3<<11) | (r4<<6) | opc2);
3531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Emit an instruction into buf and return the number of bytes used.
3537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Note that buf is not the insn's final place, and therefore it is
3538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   imperative to emit position-independent code.  If the emitted
3539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   instruction was a profiler inc, set *is_profInc to True, else leave
3540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   it unchanged.
3541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
3542663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt emit_PPCInstr ( /*MB_MOD*/Bool* is_profInc,
3543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    UChar* buf, Int nbuf, PPCInstr* i,
3544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    Bool mode64,
3545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    void* disp_cp_chain_me_to_slowEP,
3546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    void* disp_cp_chain_me_to_fastEP,
3547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    void* disp_cp_xindir,
3548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    void* disp_cp_xassisted )
3549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UChar* p = &buf[0];
3551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(nbuf >= 32);
3552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (0) {
3554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("asm  ");ppPPCInstr(i, mode64); vex_printf("\n");
3555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (i->tag) {
3558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LI:
3560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkLoadImm(p, iregNo(i->Pin.LI.dst, mode64),
3561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    i->Pin.LI.imm64, mode64);
3562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Alu: {
3565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* srcR   = i->Pin.Alu.srcR;
3566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool   immR   = toBool(srcR->tag == Prh_Imm);
3567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_dst  = iregNo(i->Pin.Alu.dst, mode64);
3568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_srcL = iregNo(i->Pin.Alu.srcL, mode64);
3569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_srcR = immR ? (-1)/*bogus*/ :
3570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             iregNo(srcR->Prh.Reg.reg, mode64);
3571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.Alu.op) {
3573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_ADD:
3574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* addi (PPC32 p350) */
3576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(srcR->Prh.Imm.syned);
3577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(srcR->Prh.Imm.imm16 != 0x8000);
3578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 14, r_dst, r_srcL, srcR->Prh.Imm.imm16);
3579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* add (PPC32 p347) */
3581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 266, 0);
3582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_SUB:
3586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* addi (PPC32 p350), but with negated imm */
3588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(srcR->Prh.Imm.syned);
3589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(srcR->Prh.Imm.imm16 != 0x8000);
3590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 14, r_dst, r_srcL, (- srcR->Prh.Imm.imm16));
3591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* subf (PPC32 p537), with args the "wrong" way round */
3593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 40, 0);
3594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_AND:
3598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* andi. (PPC32 p358) */
3600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(!srcR->Prh.Imm.syned);
3601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 28, r_srcL, r_dst, srcR->Prh.Imm.imm16);
3602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* and (PPC32 p356) */
3604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 28, 0);
3605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_OR:
3609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* ori (PPC32 p497) */
3611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(!srcR->Prh.Imm.syned);
3612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 24, r_srcL, r_dst, srcR->Prh.Imm.imm16);
3613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* or (PPC32 p495) */
3615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 444, 0);
3616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_XOR:
3620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* xori (PPC32 p550) */
3622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(!srcR->Prh.Imm.syned);
3623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 26, r_srcL, r_dst, srcR->Prh.Imm.imm16);
3624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* xor (PPC32 p549) */
3626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 316, 0);
3627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
3631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
3632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Shft: {
3637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* srcR   = i->Pin.Shft.srcR;
3638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool   sz32   = i->Pin.Shft.sz32;
3639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool   immR   = toBool(srcR->tag == Prh_Imm);
3640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_dst  = iregNo(i->Pin.Shft.dst, mode64);
3641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_srcL = iregNo(i->Pin.Shft.srcL, mode64);
3642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_srcR = immR ? (-1)/*bogus*/ :
3643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             iregNo(srcR->Prh.Reg.reg, mode64);
3644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64)
3645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(sz32);
3646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.Shft.op) {
3648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pshft_SHL:
3649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32) {
3650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* rd = rs << n, 1 <= n <= 31
3652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  is
3653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  rlwinm rd,rs,n,0,31-n  (PPC32 p501)
3654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               */
3655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 32);
3658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormM(p, 21, r_srcL, r_dst, n, 0, 31-n, 0);
3659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* slw (PPC32 p505) */
3661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 24, 0);
3662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* rd = rs << n, 1 <= n <= 63
3666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  is
3667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  rldicr rd,rs,n,63-n  (PPC64 p559)
3668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               */
3669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 64);
3672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormMD(p, 30, r_srcL, r_dst, n, 63-n, 1);
3673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* sld (PPC64 p568) */
3675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 27, 0);
3676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pshft_SHR:
3681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32) {
3682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             if (immR) {
3683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* rd = rs >>u n, 1 <= n <= 31
3684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  is
3685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  rlwinm rd,rs,32-n,n,31  (PPC32 p501)
3686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               */
3687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 32);
3690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormM(p, 21, r_srcL, r_dst, 32-n, n, 31, 0);
3691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* srw (PPC32 p508) */
3693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 536, 0);
3694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* rd = rs >>u n, 1 <= n <= 63
3698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  is
3699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  rldicl rd,rs,64-n,n  (PPC64 p558)
3700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               */
3701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 64);
3704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormMD(p, 30, r_srcL, r_dst, 64-n, n, 0);
3705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* srd (PPC64 p574) */
3707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 539, 0);
3708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pshft_SAR:
3713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32) {
3714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* srawi (PPC32 p507) */
3716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* In 64-bit mode, we allow right shifts by zero bits
3719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  as that is a handy way to sign extend the lower 32
3720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  bits into the upper 32 bits. */
3721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (mode64)
3722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  vassert(n >= 0 && n < 32);
3723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               else
3724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  vassert(n > 0 && n < 32);
3725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, n, 824, 0);
3726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* sraw (PPC32 p506) */
3728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 792, 0);
3729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* sradi (PPC64 p571) */
3733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 64);
3736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXS(p, 31, r_srcL, r_dst, n, 413, 0);
3737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* srad (PPC32 p570) */
3739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 794, 0);
3740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
3745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
3746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AddSubC: {
3751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool isAdd  = i->Pin.AddSubC.isAdd;
3752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool setC   = i->Pin.AddSubC.setC;
3753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcL = iregNo(i->Pin.AddSubC.srcL, mode64);
3754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcR = iregNo(i->Pin.AddSubC.srcR, mode64);
3755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst  = iregNo(i->Pin.AddSubC.dst, mode64);
3756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (isAdd) {
3758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (setC) /* addc (PPC32 p348) */
3759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 10, 0);
3760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else          /* adde (PPC32 p349) */
3761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 138, 0);
3762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
3763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* subfX, with args the "wrong" way round */
3764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (setC) /* subfc (PPC32 p538) */
3765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 8, 0);
3766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else          /* subfe (PPC32 p539) */
3767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 136, 0);
3768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Cmp: {
3773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool syned  = i->Pin.Cmp.syned;
3774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool sz32   = i->Pin.Cmp.sz32;
3775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fld1   = i->Pin.Cmp.crfD << 2;
3776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcL = iregNo(i->Pin.Cmp.srcL, mode64);
3777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcR, imm_srcR;
3778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* srcR = i->Pin.Cmp.srcR;
3779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64)        // cmp double word invalid for mode32
3781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(sz32);
3782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else if (!sz32)     // mode64 && cmp64: set L=1
3783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fld1 |= 1;
3784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (srcR->tag) {
3786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Prh_Imm:
3787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(syned == srcR->Prh.Imm.syned);
3788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         imm_srcR = srcR->Prh.Imm.imm16;
3789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (syned) {  // cmpw/di  (signed)   (PPC32 p368)
3790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(imm_srcR != 0x8000);
3791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 11, fld1, r_srcL, imm_srcR);
3792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {      // cmplw/di (unsigned) (PPC32 p370)
3793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 10, fld1, r_srcL, imm_srcR);
3794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Prh_Reg:
3797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_srcR = iregNo(srcR->Prh.Reg.reg, mode64);
3798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (syned)  // cmpwi  (signed)   (PPC32 p367)
3799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, fld1, r_srcL, r_srcR, 0, 0);
3800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else        // cmplwi (unsigned) (PPC32 p379)
3801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, fld1, r_srcL, r_srcR, 32, 0);
3802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
3804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
3805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Unary: {
3810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst = iregNo(i->Pin.Unary.dst, mode64);
3811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_src = iregNo(i->Pin.Unary.src, mode64);
3812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.Unary.op) {
3814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_NOT:  // nor r_dst,r_src,r_src
3815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_src, r_dst, r_src, 124, 0);
3816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_NEG:  // neg r_dst,r_src
3818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormXO(p, 31, r_dst, r_src, 0, 0, 104, 0);
3819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_CLZ32:  // cntlzw r_dst, r_src
3821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_src, r_dst, 0, 26, 0);
3822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_CLZ64:  // cntlzd r_dst, r_src
3824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
3825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_src, r_dst, 0, 58, 0);
3826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_EXTSW:  // extsw r_dst, r_src
3828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
3829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_src, r_dst, 0, 986, 0);
3830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default: goto bad;
3832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MulL: {
3837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool syned  = i->Pin.MulL.syned;
3838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool sz32   = i->Pin.MulL.sz32;
3839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst  = iregNo(i->Pin.MulL.dst, mode64);
3840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcL = iregNo(i->Pin.MulL.srcL, mode64);
3841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcR = iregNo(i->Pin.MulL.srcR, mode64);
3842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64)
3844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(sz32);
3845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.MulL.hi) {
3847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // mul hi words, must consider sign
3848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32) {
3849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (syned)  // mulhw r_dst,r_srcL,r_srcR
3850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 75, 0);
3851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else        // mulhwu r_dst,r_srcL,r_srcR
3852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 11, 0);
3853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (syned)  // mulhd r_dst,r_srcL,r_srcR
3855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 73, 0);
3856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else        // mulhdu r_dst,r_srcL,r_srcR
3857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 9, 0);
3858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
3860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // mul low word, sign is irrelevant
3861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(!i->Pin.MulL.syned);
3862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32)      // mullw r_dst,r_srcL,r_srcR
3863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 235, 0);
3864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else           // mulld r_dst,r_srcL,r_srcR
3865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 233, 0);
3866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Div: {
3871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool syned  = i->Pin.Div.syned;
3872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool sz32   = i->Pin.Div.sz32;
3873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst  = iregNo(i->Pin.Div.dst, mode64);
3874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcL = iregNo(i->Pin.Div.srcL, mode64);
3875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcR = iregNo(i->Pin.Div.srcR, mode64);
3876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64)
3878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(sz32);
3879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (i->Pin.Div.extended) {
3881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (sz32) {
3882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (syned)
3883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               // divwe r_dst,r_srcL,r_srcR
3884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 427, 0);
3885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
3886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               // divweu r_dst,r_srcL,r_srcR
3887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 395, 0);
3888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
3889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (syned)
3890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               // divde r_dst,r_srcL,r_srcR
3891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 425, 0);
3892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
3893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               // divdeu r_dst,r_srcL,r_srcR
3894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 393, 0);
3895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
3896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else if (sz32) {
3897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (syned)  // divw r_dst,r_srcL,r_srcR
3898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 491, 0);
3899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else        // divwu r_dst,r_srcL,r_srcR
3900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 459, 0);
3901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
3902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (syned)  // divd r_dst,r_srcL,r_srcR
3903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 489, 0);
3904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else        // divdu r_dst,r_srcL,r_srcR
3905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 457, 0);
3906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Call: {
3911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cond  = i->Pin.Call.cond;
3912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt        r_dst = 10;
3913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* As per detailed comment for Pin_Call in
3914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         getRegUsage_PPCInstr above, %r10 is used as an address temp */
3915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* jump over the following insns if condition does not hold */
3917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
3918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test != Pct_ALWAYS) {
3919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* jmp fwds if !condition */
3920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* don't know how many bytes to jump over yet...
3921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            make space for a jump instruction and fill in later. */
3922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ptmp = p; /* fill in this bit later */
3923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p += 4;                                          // p += 4
3924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* load target to r_dst */                          // p += 4|8|20
3927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkLoadImm(p, r_dst, i->Pin.Call.target, mode64);
3928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* mtspr 9,r_dst => move r_dst to count register */
3930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormXFX(p, r_dst, 9, 467);                    // p += 4
3931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* bctrl => branch to count register (and save to lr) */
3933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 1);      // p += 4
3934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Fix up the conditional jump, if there was one. */
3936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test != Pct_ALWAYS) {
3937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Int delta = p - ptmp;
3938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(delta >= 16 && delta <= 32);
3939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,delta */
3940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         mkFormB(ptmp, invertCondTest(cond.test),
3941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 cond.flag, (delta>>2), 0, 0);
3942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XDirect: {
3947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* NB: what goes on here has to be very closely coordinated
3948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         with the chainXDirect_PPC and unchainXDirect_PPC below. */
3949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We're generating chain-me requests here, so we need to be
3950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            sure this is actually allowed -- no-redir translations
3951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            can't use chain-me's.  Hence: */
3952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(disp_cp_chain_me_to_slowEP != NULL);
3953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(disp_cp_chain_me_to_fastEP != NULL);
3954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* First off, if this is conditional, create a conditional jump
3956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         over the rest of it.  Or at least, leave a space for it that
3957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         we will shortly fill in. */
3958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
3959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XDirect.cond.test != Pct_ALWAYS) {
3960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XDirect.cond.flag != Pcf_NONE);
3961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ptmp = p;
3962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p += 4;
3963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
3964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XDirect.cond.flag == Pcf_NONE);
3965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Update the guest CIA. */
3968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64 r30, dstGA */
3969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (!mode64) vassert(0 == (((ULong)i->Pin.XDirect.dstGA) >> 32));
3970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm(p, /*r*/30, (ULong)i->Pin.XDirect.dstGA, mode64);
3971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* stw/std r30, amCIA */
3972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_machine_word(
3973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             p, False/*!isLoad*/,
3974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             /*r*/30, i->Pin.XDirect.amCIA, mode64
3975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          );
3976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* --- FIRST PATCHABLE BYTE follows --- */
3978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* VG_(disp_cp_chain_me_to_{slowEP,fastEP}) (where we're calling
3979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         to) backs up the return address, so as to find the address of
3980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         the first patchable byte.  So: don't change the number of
3981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         instructions (32-bit: 4, 64-bit: 7) below. */
3982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64-fixed r30, VG_(disp_cp_chain_me_to_{slowEP,fastEP} */
3983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      void* disp_cp_chain_me
3984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               = i->Pin.XDirect.toFastEP ? disp_cp_chain_me_to_fastEP
3985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         : disp_cp_chain_me_to_slowEP;
3986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm_EXACTLY2or5(
3987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             p, /*r*/30, Ptr_to_ULong(disp_cp_chain_me), mode64);
3988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* mtctr r30 */
3989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFX(p, /*r*/30, 9, 467);
3990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bctrl */
3991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 1);
3992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* --- END of PATCHABLE BYTES --- */
3993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Fix up the conditional jump, if there was one. */
3995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XDirect.cond.test != Pct_ALWAYS) {
3996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         Int delta = p - ptmp;
3997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(delta >= 16 && delta <= 64 && 0 == (delta & 3));
3998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* bc !ct,cf,delta */
3999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         mkFormB(ptmp, invertCondTest(i->Pin.XDirect.cond.test),
4000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 i->Pin.XDirect.cond.flag, (delta>>2), 0, 0);
4001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
4002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
4003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XIndir: {
4006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We're generating transfers that could lead indirectly to a
4007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         chain-me, so we need to be sure this is actually allowed --
4008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         no-redir translations are not allowed to reach normal
4009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         translations without going through the scheduler.  That means
4010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         no XDirects or XIndirs out from no-redir translations.
4011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         Hence: */
4012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(disp_cp_xindir != NULL);
4013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* First off, if this is conditional, create a conditional jump
4015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         over the rest of it.  Or at least, leave a space for it that
4016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         we will shortly fill in. */
4017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
4018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XIndir.cond.test != Pct_ALWAYS) {
4019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XIndir.cond.flag != Pcf_NONE);
4020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ptmp = p;
4021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p += 4;
4022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
4023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XIndir.cond.flag == Pcf_NONE);
4024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Update the guest CIA. */
4027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* stw/std r-dstGA, amCIA */
4028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_machine_word(
4029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             p, False/*!isLoad*/,
4030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             iregNo(i->Pin.XIndir.dstGA, mode64),
4031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             i->Pin.XIndir.amCIA, mode64
4032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          );
4033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64 r30, VG_(disp_cp_xindir) */
4035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm(p, /*r*/30, (ULong)Ptr_to_ULong(disp_cp_xindir), mode64);
4036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* mtctr r30 */
4037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFX(p, /*r*/30, 9, 467);
4038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bctr */
4039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0);
4040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Fix up the conditional jump, if there was one. */
4042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XIndir.cond.test != Pct_ALWAYS) {
4043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         Int delta = p - ptmp;
4044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(delta >= 16 && delta <= 32 && 0 == (delta & 3));
4045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* bc !ct,cf,delta */
4046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         mkFormB(ptmp, invertCondTest(i->Pin.XIndir.cond.test),
4047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 i->Pin.XIndir.cond.flag, (delta>>2), 0, 0);
4048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
4050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XAssisted: {
4053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* First off, if this is conditional, create a conditional jump
4054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         over the rest of it.  Or at least, leave a space for it that
4055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         we will shortly fill in. */
4056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
4057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XAssisted.cond.test != Pct_ALWAYS) {
4058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XAssisted.cond.flag != Pcf_NONE);
4059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ptmp = p;
4060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p += 4;
4061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XAssisted.cond.flag == Pcf_NONE);
4063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Update the guest CIA. */
4066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* stw/std r-dstGA, amCIA */
4067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_machine_word(
4068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             p, False/*!isLoad*/,
4069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             iregNo(i->Pin.XIndir.dstGA, mode64),
4070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             i->Pin.XIndir.amCIA, mode64
4071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          );
4072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64 r31, $magic_number */
4074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt trcval = 0;
4075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.XAssisted.jk) {
4076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_ClientReq:   trcval = VEX_TRC_JMP_CLIENTREQ;   break;
4077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break;
4078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_Sys_int128:  trcval = VEX_TRC_JMP_SYS_INT128;  break;
4079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_Yield:       trcval = VEX_TRC_JMP_YIELD;       break;
4080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_EmWarn:      trcval = VEX_TRC_JMP_EMWARN;      break;
4081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_EmFail:      trcval = VEX_TRC_JMP_EMFAIL;      break;
4082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_MapFail:     trcval = VEX_TRC_JMP_MAPFAIL;     break;
4083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_NoDecode:    trcval = VEX_TRC_JMP_NODECODE;    break;
4084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_TInval:      trcval = VEX_TRC_JMP_TINVAL;      break;
4085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_NoRedir:     trcval = VEX_TRC_JMP_NOREDIR;     break;
4086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_SigTRAP:     trcval = VEX_TRC_JMP_SIGTRAP;     break;
4087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_SigSEGV:     trcval = VEX_TRC_JMP_SIGSEGV;     break;
4088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_SigBUS:        trcval = VEX_TRC_JMP_SIGBUS;    break;
4089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_Boring:      trcval = VEX_TRC_JMP_BORING;      break;
4090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* We don't expect to see the following being assisted. */
4091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_Ret:
4092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_Call:
4093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* fallthrough */
4094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
4095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            ppIRJumpKind(i->Pin.XAssisted.jk);
4096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vpanic("emit_ARMInstr.Pin_XAssisted: unexpected jump kind");
4097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
4098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(trcval != 0);
4099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm(p, /*r*/31, trcval, mode64);
4100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64 r30, VG_(disp_cp_xassisted) */
4102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm(p, /*r*/30,
4103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       (ULong)Ptr_to_ULong(disp_cp_xassisted), mode64);
4104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* mtctr r30 */
4105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFX(p, /*r*/30, 9, 467);
4106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bctr */
4107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0);
4108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Fix up the conditional jump, if there was one. */
4110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XAssisted.cond.test != Pct_ALWAYS) {
4111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Int delta = p - ptmp;
4112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(delta >= 16 && delta <= 32 && 0 == (delta & 3));
4113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,delta */
4114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         mkFormB(ptmp, invertCondTest(i->Pin.XAssisted.cond.test),
4115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 i->Pin.XAssisted.cond.flag, (delta>>2), 0, 0);
4116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_CMov: {
4121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt  r_dst, r_src;
4122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong imm_src;
4123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cond;
4124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(i->Pin.CMov.cond.test != Pct_ALWAYS);
4125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r_dst = iregNo(i->Pin.CMov.dst, mode64);
4127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      cond = i->Pin.CMov.cond;
4128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* branch (if cond fails) over move instrs */
4130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
4131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test != Pct_ALWAYS) {
4132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* don't know how many bytes to jump over yet...
4133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            make space for a jump instruction and fill in later. */
4134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ptmp = p; /* fill in this bit later */
4135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p += 4;
4136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // cond true: move src => dst
4139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.CMov.src->tag) {
4140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Imm:
4141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         imm_src = i->Pin.CMov.src->Pri.Imm;
4142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkLoadImm(p, r_dst, imm_src, mode64);  // p += 4|8|20
4143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Reg:
4145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_src = iregNo(i->Pin.CMov.src->Pri.Reg, mode64);
4146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkMoveReg(p, r_dst, r_src);            // p += 4
4147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default: goto bad;
4149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Fix up the conditional jump, if there was one. */
4152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test != Pct_ALWAYS) {
4153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Int delta = p - ptmp;
4154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(delta >= 8 && delta <= 24);
4155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,delta */
4156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         mkFormB(ptmp, invertCondTest(cond.test),
4157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 cond.flag, (delta>>2), 0, 0);
4158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Load: {
4163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCAMode* am_addr = i->Pin.Load.src;
4164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst = iregNo(i->Pin.Load.dst, mode64);
4165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc1, opc2, sz = i->Pin.Load.sz;
4166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (am_addr->tag) {
4167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pam_IR:
4168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (mode64 && (sz == 4 || sz == 8)) {
4169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* should be guaranteed to us by iselWordExpr_AMode */
4170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(0 == (am_addr->Pam.IR.index & 3));
4171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch(sz) {
4173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 1:  opc1 = 34; break;
4174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 2:  opc1 = 40; break;
4175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 4:  opc1 = 32; break;
4176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 8:  opc1 = 58; vassert(mode64); break;
4177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            default: goto bad;
4178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = doAMode_IR(p, opc1, r_dst, am_addr, mode64);
4180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pam_RR:
4182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch(sz) {
4183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 1:  opc2 = 87;  break;
4184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 2:  opc2 = 279; break;
4185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 4:  opc2 = 23;  break;
4186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 8:  opc2 = 21; vassert(mode64); break;
4187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            default: goto bad;
4188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = doAMode_RR(p, 31, opc2, r_dst, am_addr, mode64);
4190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LoadL: {
4197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.LoadL.sz == 4) {
4198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, iregNo(i->Pin.LoadL.dst, mode64),
4199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     0, iregNo(i->Pin.LoadL.src, mode64), 20, 0);
4200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.LoadL.sz == 8 && mode64) {
4203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, iregNo(i->Pin.LoadL.dst, mode64),
4204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     0, iregNo(i->Pin.LoadL.src, mode64), 84, 0);
4205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto bad;
4208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Set: {
4211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Make the destination register be 1 or 0, depending on whether
4212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         the relevant condition holds. */
4213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt        r_dst = iregNo(i->Pin.Set.dst, mode64);
4214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cond  = i->Pin.Set.cond;
4215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt rot_imm, r_tmp;
4216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test == Pct_ALWAYS) {
4218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Just load 1 to dst => li dst,1
4219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormD(p, 14, r_dst, 0, 1);
4220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vassert(cond.flag != Pcf_NONE);
4222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         rot_imm = 1 + cond.flag;
4223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_tmp = 0;  // Not set in getAllocable, so no need to declare.
4224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // r_tmp = CR  => mfcr r_tmp
4226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_tmp, 0, 0, 19, 0);
4227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // r_dst = flag (rotate left and mask)
4229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         //  => rlwinm r_dst,r_tmp,rot_imm,31,31
4230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormM(p, 21, r_tmp, r_dst, rot_imm, 31, 31, 0);
4231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (cond.test == Pct_FALSE) {
4233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // flip bit  => xori r_dst,r_dst,1
4234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 26, r_dst, r_dst, 1);
4235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MfCR:
4241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // mfcr dst
4242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, iregNo(i->Pin.MfCR.dst, mode64), 0, 0, 19, 0);
4243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MFence: {
4246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, 0, 0, 0, 598, 0);   // sync, PPC32 p616
4247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // CAB: Should this be isync?
4248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //    p = mkFormXL(p, 19, 0, 0, 0, 150, 0);  // isync, PPC32 p467
4249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Store: {
4253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCAMode* am_addr = i->Pin.Store.dst;
4254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_src = iregNo(i->Pin.Store.src, mode64);
4255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc1, opc2, sz = i->Pin.Store.sz;
4256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.Store.dst->tag) {
4257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pam_IR:
4258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (mode64 && (sz == 4 || sz == 8)) {
4259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* should be guaranteed to us by iselWordExpr_AMode */
4260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(0 == (am_addr->Pam.IR.index & 3));
4261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch(sz) {
4263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 1: opc1 = 38; break;
4264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 2: opc1 = 44; break;
4265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 4: opc1 = 36; break;
4266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 8: vassert(mode64);
4267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 opc1 = 62; break;
4268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         default:
4269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            goto bad;
4270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = doAMode_IR(p, opc1, r_src, am_addr, mode64);
4272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pam_RR:
4274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch(sz) {
4275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 1: opc2 = 215; break;
4276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 2: opc2 = 407; break;
4277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 4: opc2 = 151; break;
4278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 8: vassert(mode64);
4279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 opc2 = 149; break;
4280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         default:
4281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            goto bad;
4282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = doAMode_RR(p, 31, opc2, r_src, am_addr, mode64);
4284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_StoreC: {
4292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.StoreC.sz == 4) {
4293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, iregNo(i->Pin.StoreC.src, mode64),
4294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     0, iregNo(i->Pin.StoreC.dst, mode64), 150, 1);
4295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.StoreC.sz == 8 && mode64) {
4298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, iregNo(i->Pin.StoreC.src, mode64),
4299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     0, iregNo(i->Pin.StoreC.dst, mode64), 214, 1);
4300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto bad;
4303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpUnary: {
4306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst = fregNo(i->Pin.FpUnary.dst);
4307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_src = fregNo(i->Pin.FpUnary.src);
4308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.FpUnary.op) {
4309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_RSQRTE: // frsqrtre, PPC32 p424
4310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, 0, fr_src, 0, 26, 0 );
4311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_RES:   // fres, PPC32 p421
4313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, 0, fr_src, 0, 24, 0 );
4314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_SQRT:  // fsqrt, PPC32 p427
4316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, 0, fr_src, 0, 22, 0 );
4317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_ABS:   // fabs, PPC32 p399
4319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 264, 0);
4320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_NEG:   // fneg, PPC32 p416
4322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 40, 0);
4323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MOV:   // fmr, PPC32 p410
4325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 72, 0);
4326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIM:  // frim, PPC ISA 2.05 p137
4328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 488, 0);
4329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIP:  // frip, PPC ISA 2.05 p137
4331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 456, 0);
4332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIN:  // frin, PPC ISA 2.05 p137
4334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 392, 0);
4335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIZ:  // friz, PPC ISA 2.05 p137
4337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 424, 0);
4338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpBinary: {
4346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst  = fregNo(i->Pin.FpBinary.dst);
4347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcL = fregNo(i->Pin.FpBinary.srcL);
4348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcR = fregNo(i->Pin.FpBinary.srcR);
4349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.FpBinary.op) {
4350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_ADDD:   // fadd, PPC32 p400
4351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 21, 0 );
4352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_ADDS:   // fadds, PPC32 p401
4354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 21, 0 );
4355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_SUBD:   // fsub, PPC32 p429
4357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 20, 0 );
4358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_SUBS:   // fsubs, PPC32 p430
4360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 20, 0 );
4361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MULD:   // fmul, PPC32 p413
4363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcL, 0, fr_srcR, 25, 0 );
4364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MULS:   // fmuls, PPC32 p414
4366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcL, 0, fr_srcR, 25, 0 );
4367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_DIVD:   // fdiv, PPC32 p406
4369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 18, 0 );
4370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_DIVS:   // fdivs, PPC32 p407
4372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 18, 0 );
4373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpMulAcc: {
4381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst    = fregNo(i->Pin.FpMulAcc.dst);
4382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcML  = fregNo(i->Pin.FpMulAcc.srcML);
4383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcMR  = fregNo(i->Pin.FpMulAcc.srcMR);
4384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcAcc = fregNo(i->Pin.FpMulAcc.srcAcc);
4385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.FpMulAcc.op) {
4386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MADDD:   // fmadd, PPC32 p408
4387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 29, 0 );
4388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MADDS:   // fmadds, PPC32 p409
4390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 29, 0 );
4391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MSUBD:   // fmsub, PPC32 p411
4393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 28, 0 );
4394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MSUBS:   // fmsubs, PPC32 p412
4396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 28, 0 );
4397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdSt: {
4405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCAMode* am_addr = i->Pin.FpLdSt.addr;
4406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt f_reg = fregNo(i->Pin.FpLdSt.reg);
4407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool idxd = toBool(i->Pin.FpLdSt.addr->tag == Pam_RR);
4408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.FpLdSt.sz;
4409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc;
4410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(sz == 4 || sz == 8);
4411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpLdSt.isLoad) {   // Load from memory
4413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (idxd) {  // lf[s|d]x, PPC32 p444|440
4414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            opc = (sz == 4) ? 535 : 599;
4415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = doAMode_RR(p, 31, opc, f_reg, am_addr, mode64);
4416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {     // lf[s|d], PPC32 p441|437
4417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            opc = (sz == 4) ? 48 : 50;
4418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = doAMode_IR(p, opc, f_reg, am_addr, mode64);
4419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {                      // Store to memory
4421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (idxd) { // stf[s|d]x, PPC32 p521|516
4422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            opc = (sz == 4) ? 663 : 727;
4423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = doAMode_RR(p, 31, opc, f_reg, am_addr, mode64);
4424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {    // stf[s|d], PPC32 p518|513
4425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            opc = (sz == 4) ? 52 : 54;
4426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = doAMode_IR(p, opc, f_reg, am_addr, mode64);
4427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpSTFIW: {
4433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt ir_addr = iregNo(i->Pin.FpSTFIW.addr, mode64);
4434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_data = fregNo(i->Pin.FpSTFIW.data);
4435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // stfiwx (store fp64[lo32] as int32), PPC32 p517
4436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Use rA==0, so that EA == rB == ir_addr
4437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, fr_data, 0/*rA=0*/, ir_addr, 983, 0);
4438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpRSP: {
4442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst = fregNo(i->Pin.FpRSP.dst);
4443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_src = fregNo(i->Pin.FpRSP.src);
4444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // frsp, PPC32 p423
4445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 63, fr_dst, 0, fr_src, 12, 0);
4446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCftI: {
4450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst = fregNo(i->Pin.FpCftI.dst);
4451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_src = fregNo(i->Pin.FpCftI.src);
4452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == True) {
4453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True) {
4454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fctiw (conv f64 to i32), PPC32 p404
4455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 14, 0);
4456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
4458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fctiwu (conv f64 to u32)
4459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 142, 0);
4460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
4462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == False) {
4464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True) {
4465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fctid (conv f64 to i64), PPC64 p437
4466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 814, 0);
4467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
4469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fctidu (conv f64 to u64)
4470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 942, 0);
4471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
4473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) {
4475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True) {
4476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fcfid (conv i64 to f64), PPC64 p434
4477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 846, 0);
4478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else if (i->Pin.FpCftI.flt64 == True) {
4480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fcfidu (conv u64 to f64)
4481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 974, 0);
4482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
4484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fcfidus (conv u64 to f32)
4485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 59, fr_dst, 0, fr_src, 974, 0);
4486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
4488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto bad;
4490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCMov: {
4493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt        fr_dst = fregNo(i->Pin.FpCMov.dst);
4494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt        fr_src = fregNo(i->Pin.FpCMov.src);
4495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cc     = i->Pin.FpCMov.cond;
4496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (fr_dst == fr_src) goto done;
4498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(cc.test != Pct_ALWAYS);
4500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* jmp fwds if !condition */
4502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cc.test != Pct_ALWAYS) {
4503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,n_bytes>>2 */
4504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormB(p, invertCondTest(cc.test), cc.flag, 8>>2, 0, 0);
4505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // fmr, PPC32 p410
4508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 63, fr_dst, 0, fr_src, 72, 0);
4509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdFPSCR: {
4513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_src = fregNo(i->Pin.FpLdFPSCR.src);
4514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFL(p, 0xFF, fr_src, i->Pin.FpLdFPSCR.dfp_rm);     // mtfsf, PPC32 p480
4515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCmp: {
4519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar crfD    = 1;
4520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt  r_dst   = iregNo(i->Pin.FpCmp.dst, mode64);
4521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt  fr_srcL = fregNo(i->Pin.FpCmp.srcL);
4522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt  fr_srcR = fregNo(i->Pin.FpCmp.srcR);
4523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(crfD < 8);
4524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // fcmpo, PPC32 p402
4525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 63, crfD<<2, fr_srcL, fr_srcR, 32, 0);
4526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // mfcr (mv CR to r_dst), PPC32 p467
4528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, r_dst, 0, 0, 19, 0);
4529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // rlwinm r_dst,r_dst,8,28,31, PPC32 p501
4531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //  => rotate field 1 to bottomw of word, masking out upper 28
4532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0);
4533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_RdWrLR: {
4537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt reg = iregNo(i->Pin.RdWrLR.gpr, mode64);
4538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* wrLR==True ? mtlr r4 : mflr r4 */
4539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormXFX(p, reg, 8, (i->Pin.RdWrLR.wrLR==True) ? 467 : 339);
4540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* AltiVec */
4545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdSt: {
4546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2, v_reg, r_idx, r_base;
4547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz   = i->Pin.AvLdSt.sz;
4548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool  idxd = toBool(i->Pin.AvLdSt.addr->tag == Pam_RR);
4549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(sz == 1 || sz == 2 || sz == 4 || sz == 16);
4550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      v_reg  = vregNo(i->Pin.AvLdSt.reg);
4552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r_base = iregNo(i->Pin.AvLdSt.addr->Pam.RR.base, mode64);
4553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Only have AltiVec AMode_RR: kludge AMode_IR
4555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!idxd) {
4556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_idx = 30;                       // XXX: Using r30 as temp
4557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkLoadImm(p, r_idx,
4558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       i->Pin.AvLdSt.addr->Pam.IR.index, mode64);
4559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_idx  = iregNo(i->Pin.AvLdSt.addr->Pam.RR.index, mode64);
4561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpLdSt.isLoad) {  // Load from memory (1,2,4,16)
4564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         opc2 = (sz==1) ?   7 : (sz==2) ?  39 : (sz==4) ?  71 : 103;
4565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, v_reg, r_idx, r_base, opc2, 0);
4566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {                      // Store to memory (1,2,4,16)
4567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         opc2 = (sz==1) ? 135 : (sz==2) ? 167 : (sz==4) ? 199 : 231;
4568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, v_reg, r_idx, r_base, opc2, 0);
4569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUnary: {
4574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst = vregNo(i->Pin.AvUnary.dst);
4575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src = vregNo(i->Pin.AvUnary.src);
4576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvUnary.op) {
4578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MOV:       opc2 = 1156; break; // vor vD,vS,vS
4579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_NOT:       opc2 = 1284; break; // vnor vD,vS,vS
4580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKH8S:  opc2 =  526; break; // vupkhsb
4581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKH16S: opc2 =  590; break; // vupkhsh
4582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKL8S:  opc2 =  654; break; // vupklsb
4583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKL16S: opc2 =  718; break; // vupklsh
4584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKHPIX: opc2 =  846; break; // vupkhpx
4585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKLPIX: opc2 =  974; break; // vupklpx
4586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvUnary.op) {
4590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MOV:
4591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_NOT:
4592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_src, v_src, opc2 );
4593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, 0, v_src, opc2 );
4596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBinary: {
4602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBinary.dst);
4603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBinary.srcL);
4604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBinary.srcR);
4605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvBinary.op == Pav_SHL) {
4607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1036 ); // vslo
4608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_dst,  v_srcR, 452 );  // vsl
4609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvBinary.op == Pav_SHR) {
4612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1100 ); // vsro
4613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_dst,  v_srcR, 708 );  // vsr
4614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBinary.op) {
4617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Bitwise */
4618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AND:       opc2 = 1028; break; // vand
4619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OR:        opc2 = 1156; break; // vor
4620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_XOR:       opc2 = 1220; break; // vxor
4621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
4625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin8x16: {
4629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBin8x16.dst);
4630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBin8x16.srcL);
4631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBin8x16.srcR);
4632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBin8x16.op) {
4634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ADDU:     opc2 =    0; break; // vaddubm
4636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDU:    opc2 =  512; break; // vaddubs
4637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDS:    opc2 =  768; break; // vaddsbs
4638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SUBU:     opc2 = 1024; break; // vsububm
4640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBU:    opc2 = 1536; break; // vsububs
4641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBS:    opc2 = 1792; break; // vsubsbs
4642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OMULU:   opc2 =    8; break; // vmuloub
4644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OMULS:   opc2 =  264; break; // vmulosb
4645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_EMULU:   opc2 =  520; break; // vmuleub
4646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_EMULS:   opc2 =  776; break; // vmulesb
4647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGU:     opc2 = 1026; break; // vavgub
4649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGS:     opc2 = 1282; break; // vavgsb
4650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXU:     opc2 =    2; break; // vmaxub
4651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXS:     opc2 =  258; break; // vmaxsb
4652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINU:     opc2 =  514; break; // vminub
4653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINS:     opc2 =  770; break; // vminsb
4654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPEQU:   opc2 =    6; break; // vcmpequb
4656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTU:   opc2 =  518; break; // vcmpgtub
4657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTS:   opc2 =  774; break; // vcmpgtsb
4658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHL:      opc2 =  260; break; // vslb
4660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHR:      opc2 =  516; break; // vsrb
4661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SAR:      opc2 =  772; break; // vsrab
4662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ROTL:     opc2 =    4; break; // vrlb
4663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGHI:    opc2 =   12; break; // vmrghb
4665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGLO:    opc2 =  268; break; // vmrglb
4666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
4671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin16x8: {
4675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBin16x8.dst);
4676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBin16x8.srcL);
4677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBin16x8.srcR);
4678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBin16x8.op) {
4680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ADDU:    opc2 =   64; break; // vadduhm
4682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDU:   opc2 =  576; break; // vadduhs
4683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDS:   opc2 =  832; break; // vaddshs
4684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SUBU:    opc2 = 1088; break; // vsubuhm
4686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBU:   opc2 = 1600; break; // vsubuhs
4687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBS:   opc2 = 1856; break; // vsubshs
4688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OMULU:   opc2 =   72; break; // vmulouh
4690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OMULS:   opc2 =  328; break; // vmulosh
4691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_EMULU:   opc2 =  584; break; // vmuleuh
4692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_EMULS:   opc2 =  840; break; // vmulesh
4693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGU:    opc2 = 1090; break; // vavguh
4695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGS:    opc2 = 1346; break; // vavgsh
4696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXU:    opc2 =   66; break; // vmaxuh
4697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXS:    opc2 =  322; break; // vmaxsh
4698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINS:    opc2 =  834; break; // vminsh
4699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINU:    opc2 =  578; break; // vminuh
4700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPEQU:  opc2 =   70; break; // vcmpequh
4702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTU:  opc2 =  582; break; // vcmpgtuh
4703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTS:  opc2 =  838; break; // vcmpgtsh
4704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHL:     opc2 =  324; break; // vslh
4706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHR:     opc2 =  580; break; // vsrh
4707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SAR:     opc2 =  836; break; // vsrah
4708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ROTL:    opc2 =   68; break; // vrlh
4709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_PACKUU:  opc2 =   14; break; // vpkuhum
4711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKUU: opc2 =  142; break; // vpkuhus
4712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKSU: opc2 =  270; break; // vpkshus
4713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKSS: opc2 =  398; break; // vpkshss
4714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_PACKPXL: opc2 =  782; break; // vpkpx
4715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGHI:   opc2 =   76; break; // vmrghh
4717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGLO:   opc2 =  332; break; // vmrglh
4718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
4723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32x4: {
4727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBin32x4.dst);
4728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBin32x4.srcL);
4729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBin32x4.srcR);
4730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBin32x4.op) {
4732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ADDU:    opc2 =  128; break; // vadduwm
4734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDU:   opc2 =  640; break; // vadduws
4735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDS:   opc2 =  896; break; // vaddsws
4736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SUBU:    opc2 = 1152; break; // vsubuwm
4738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBU:   opc2 = 1664; break; // vsubuws
4739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBS:   opc2 = 1920; break; // vsubsws
4740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGU:    opc2 = 1154; break; // vavguw
4742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGS:    opc2 = 1410; break; // vavgsw
4743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXU:    opc2 =  130; break; // vmaxuw
4745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXS:    opc2 =  386; break; // vmaxsw
4746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINS:    opc2 =  898; break; // vminsw
4748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINU:    opc2 =  642; break; // vminuw
4749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPEQU:  opc2 =  134; break; // vcmpequw
4751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTS:  opc2 =  902; break; // vcmpgtsw
4752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTU:  opc2 =  646; break; // vcmpgtuw
4753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHL:     opc2 =  388; break; // vslw
4755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHR:     opc2 =  644; break; // vsrw
4756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SAR:     opc2 =  900; break; // vsraw
4757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ROTL:    opc2 =  132; break; // vrlw
4758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_PACKUU:  opc2 =   78; break; // vpkuwum
4760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKUU: opc2 =  206; break; // vpkuwus
4761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKSU: opc2 =  334; break; // vpkswus
4762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKSS: opc2 =  462; break; // vpkswss
4763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGHI:   opc2 =  140; break; // vmrghw
4765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGLO:   opc2 =  396; break; // vmrglw
4766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
4771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32Fx4: {
4775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBin32Fx4.dst);
4776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBin32Fx4.srcL);
4777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBin32Fx4.srcR);
4778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBin32Fx4.op) {
4779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ADDF:
4781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 10 );   // vaddfp
4782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_SUBF:
4784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 74 );   // vsubfp
4785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_MAXF:
4787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1034 ); // vmaxfp
4788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_MINF:
4790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1098 ); // vminfp
4791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_MULF: {
4794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Make a vmulfp from a vmaddfp:
4795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            load -0.0 (0x8000_0000) to each 32-bit word of vB
4796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            this makes the add a noop.
4797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         */
4798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt vB = 29;  // XXX: Using v29 for temp do not change
4799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        // without also changing
4800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        // getRegUsage_PPCInstr
4801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt konst = 0x1F;
4802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Better way to load -0.0 (0x80000000) ?
4804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // vspltisw vB,0x1F   (0x1F => each word of vB)
4805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, vB, konst, 0, 908 );
4806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // vslw vB,vB,vB (each word of vB = (0x1F << 0x1F) = 0x80000000
4808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, vB, vB, vB, 388 );
4809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Finally, do the multiply:
4811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVA( p, 4, v_dst, v_srcL, vB, v_srcR, 46 );
4812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CMPEQF:  // vcmpeqfp
4815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 198 );
4816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CMPGTF:  // vcmpgtfp
4818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 710 );
4819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CMPGEF:  // vcmpgefp
4821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 454 );
4822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUn32Fx4: {
4831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst = vregNo(i->Pin.AvUn32Fx4.dst);
4832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src = vregNo(i->Pin.AvUn32Fx4.src);
4833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvUn32Fx4.op) {
4835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_RCPF:    opc2 =  266; break; // vrefp
4836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_RSQRTF:  opc2 =  330; break; // vrsqrtefp
4837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CVTU2F:  opc2 =  778; break; // vcfux
4838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CVTS2F:  opc2 =  842; break; // vcfsx
4839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_QCVTF2U: opc2 =  906; break; // vctuxs
4840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_QCVTF2S: opc2 =  970; break; // vctsxs
4841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ROUNDM:  opc2 =  714; break; // vrfim
4842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ROUNDP:  opc2 =  650; break; // vrfip
4843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ROUNDN:  opc2 =  522; break; // vrfin
4844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ROUNDZ:  opc2 =  586; break; // vrfiz
4845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, 0, v_src, opc2 );
4849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvPerm: {  // vperm
4853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvPerm.dst);
4854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvPerm.srcL);
4855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvPerm.srcR);
4856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_ctl  = vregNo(i->Pin.AvPerm.ctl);
4857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, v_ctl, 43 );
4858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSel: {  // vsel
4862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_ctl  = vregNo(i->Pin.AvSel.ctl);
4863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvSel.dst);
4864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvSel.srcL);
4865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvSel.srcR);
4866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, v_ctl, 42 );
4867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvShlDbl: {  // vsldoi
4871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt shift  = i->Pin.AvShlDbl.shift;
4872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvShlDbl.dst);
4873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvShlDbl.srcL);
4874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvShlDbl.srcR);
4875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(shift <= 0xF);
4876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, shift, 44 );
4877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSplat: { // vsplt(is)(b,h,w)
4881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst = vregNo(i->Pin.AvShlDbl.dst);
4882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz   = i->Pin.AvSplat.sz;
4883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src, opc2;
4884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(sz == 8 || sz == 16 || sz == 32);
4885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvSplat.src->tag == Pvi_Imm) {
4887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Char simm5;
4888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         opc2 = (sz == 8) ? 780 : (sz == 16) ? 844 : 908;   // 8,16,32
4889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* expects 5-bit-signed-imm */
4890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         simm5 = i->Pin.AvSplat.src->Pvi.Imm5s;
4891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(simm5 >= -16 && simm5 <= 15);
4892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         simm5 = simm5 & 0x1F;
4893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, (UInt)simm5, 0, opc2 );
4894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else {  // Pri_Reg
4896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt lowest_lane;
4897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         opc2 = (sz == 8) ? 524 : (sz == 16) ? 588 : 652;  // 8,16,32
4898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(hregClass(i->Pin.AvSplat.src->Pvi.Reg) == HRcVec128);
4899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         v_src = vregNo(i->Pin.AvSplat.src->Pvi.Reg);
4900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         lowest_lane = (128/sz)-1;
4901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, lowest_lane, v_src, opc2 );
4902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvCMov: {
4907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst     = vregNo(i->Pin.AvCMov.dst);
4908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src     = vregNo(i->Pin.AvCMov.src);
4909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cc = i->Pin.AvCMov.cond;
4910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (v_dst == v_src) goto done;
4912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(cc.test != Pct_ALWAYS);
4914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* jmp fwds 2 insns if !condition */
4916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cc.test != Pct_ALWAYS) {
4917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,n_bytes>>2 */
4918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormB(p, invertCondTest(cc.test), cc.flag, 8>>2, 0, 0);
4919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* vmr */
4921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_src, v_src, 1156 );
4922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdVSCR: {  // mtvscr
4926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src = vregNo(i->Pin.AvLdVSCR.src);
4927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, 0, 0, v_src, 1604 );
4928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Unary: {
4932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst = fregNo( i->Pin.FpUnary.dst );
4933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src = fregNo( i->Pin.FpUnary.src );
4934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp64Unary.op) {
4936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_MOV: // fmr, PPC32 p410
4937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, fr_dst, 0, fr_src, 72, 0 );
4938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCTDP:   // D32 to D64
4940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 258, 0 );
4941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DRSP:    // D64 to D32
4943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 770, 0 );
4944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCFFIX:   // I64 to D64 conversion
4946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* ONLY WORKS ON POWER7 */
4947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 802, 0);
4948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCTFIX:   // D64 to I64 conversion
4950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 290, 0);
4951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DXEX:     // Extract exponent
4953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 354, 0 );
4954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
4956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
4957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
4958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
4959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Binary: {
4962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst = fregNo( i->Pin.Dfp64Binary.dst );
4963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcL = fregNo( i->Pin.Dfp64Binary.srcL );
4964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcR = fregNo( i->Pin.Dfp64Binary.srcR );
4965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp64Binary.op) {
4966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPADD: /* dadd, dfp add, use default RM from reg ignore mode
4967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        * from the Iop instruction. */
4968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 2, 0 );
4969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPSUB: /* dsub, dfp subtract, use default RM from reg ignore
4971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        * mode from the Iop instruction. */
4972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 514, 0 );
4973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPMUL: /* dmul, dfp multipy, use default RM from reg ignore
4975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        * mode from the Iop instruction. */
4976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 34, 0 );
4977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPDIV: /* ddiv, dfp divide, use default RM from reg ignore
4979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        * mode from the Iop instruction. */
4980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 546, 0 );
4981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DIEX:  /* diex, insert exponent */
4983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 866, 0 );
4984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
4985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
4986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
4987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
4988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
4989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift: {
4992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src = fregNo(i->Pin.DfpShift.src);
4993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst = fregNo(i->Pin.DfpShift.dst);
4994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt shift;
4995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      shift =  i->Pin.DfpShift.shift->Pri.Imm;
4997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.DfpShift.op) {
4999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DSCLI:    /* dscli, DFP shift left by fr_srcR */
5000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ22( p, 59, fr_dst, fr_src, shift,  66, 0 );
5001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DSCRI:    /* dscri, DFP shift right by fr_srcR */
5003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ22( p, 59, fr_dst, fr_src, shift,  98, 0 );
5004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("ERROR: emit_PPCInstr default case\n");
5007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ExtractExpD128: {
5013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst   = fregNo(i->Pin.ExtractExpD128.dst);
5014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcHi = fregNo(i->Pin.ExtractExpD128.src_hi);
5015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcLo = fregNo(i->Pin.ExtractExpD128.src_lo);
5016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.ExtractExpD128.op) {
5018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DXEXQ:
5019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Setup the upper and lower registers of the source operand
5020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * register pair.
5021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          */
5022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 12, 0, fr_srcHi, 72, 0);
5023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 13, 0, fr_srcLo, 72, 0);
5024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 0, 12, 354, 0 );
5025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* The instruction will put the 64-bit result in
5027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * register 10.
5028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          */
5029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX(p, 63, fr_dst, 0, 10,  72, 0);
5030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("Error: emit_PPCInstr case Pin_DfpExtractExp, case inst Default\n");
5033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Unary: {
5038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     UInt fr_dstHi = fregNo(i->Pin.Dfp128Unary.dst_hi);
5039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     UInt fr_dstLo = fregNo(i->Pin.Dfp128Unary.dst_lo);
5040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     UInt fr_srcLo = fregNo(i->Pin.Dfp128Unary.src_lo);
5041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     /* Do instruction with 128-bit source operands in registers (10,11)
5043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      * and (12,13).
5044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      */
5045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     switch (i->Pin.Dfp128Unary.op) {
5046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     case Pfp_DCTQPQ: // D64 to D128, srcLo holds 64 bit operand
5047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        p = mkFormX( p, 63, 12, 0, fr_srcLo, 72, 0);
5048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        p = mkFormX( p, 63, 10, 0, 12, 258, 0 );
5050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* The instruction will put the 128-bit result in
5052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         * registers (10,11).  Note, the operand in the instruction only
5053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         * reference the first of the two registers in the pair.
5054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         */
5055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        break;
5058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     default:
5059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        vex_printf("Error: emit_PPCInstr case Pin_Dfp128Unary, case inst Default\
5060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng\n");
5061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        goto bad;
5062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     }
5063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     goto done;
5064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Binary: {
5067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* dst is used to supply the  left source operand and return
5068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * the result.
5069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstHi = fregNo( i->Pin.Dfp128Binary.dst_hi );
5071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstLo = fregNo( i->Pin.Dfp128Binary.dst_lo );
5072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcRHi = fregNo( i->Pin.Dfp128Binary.srcR_hi );
5073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcRLo = fregNo( i->Pin.Dfp128Binary.srcR_lo );
5074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 10, 0, fr_dstHi, 72, 0 );
5079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 11, 0, fr_dstLo, 72, 0 );
5080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 12, 0, fr_srcRHi, 72, 0 );
5081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 13, 0, fr_srcRLo, 72, 0 );
5082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Do instruction with 128-bit source operands in registers (10,11)
5084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * and (12,13).
5085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp128Binary.op) {
5087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPADDQ:
5088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 10, 12, 2, 0 );
5089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPSUBQ:
5091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 10, 12, 514, 0 );
5092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPMULQ:
5094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 10, 12, 34, 0 );
5095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPDIVQ:
5097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 10, 12, 546, 0 );
5098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 128-bit result in
5104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (10,11).  Note, the operand in the instruction only
5105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * reference the first of the two registers in the pair.
5106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift128: {
5113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src_hi = fregNo(i->Pin.DfpShift128.src_hi);
5114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src_lo = fregNo(i->Pin.DfpShift128.src_lo);
5115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst_hi = fregNo(i->Pin.DfpShift128.dst_hi);
5116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst_lo = fregNo(i->Pin.DfpShift128.dst_lo);
5117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt shift;
5118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      shift =  i->Pin.DfpShift128.shift->Pri.Imm;
5120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* setup source operand in register 12, 13 pair */
5122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_src_hi, 72, 0);
5123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_src_lo, 72, 0);
5124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* execute instruction putting result in register 10, 11 pair */
5126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.DfpShift128.op) {
5127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DSCLIQ:    /* dscliq, DFP shift left, fr_srcR is the integer
5128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * shift amount.
5129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           */
5130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ22( p, 63, 10, 12, shift,  66, 0 );
5131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DSCRIQ:    /* dscriq, DFP shift right, fr_srcR is the integer
5133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * shift amount.
5134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           */
5135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ22( p, 63, 10, 12, shift,  98, 0 );
5136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("ERROR: emit_PPCInstr quad default case %d \n",
5139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    i->Pin.DfpShift128.op);
5140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction put the 128-bit result in registers (10,11).
5144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * Note, the operand in the instruction only reference the first of
5145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * the two registers in the pair.
5146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst_hi, 0, 10,  72, 0);
5148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst_lo, 0, 11,  72, 0);
5149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound: {
5153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst = fregNo(i->Pin.DfpRound.dst);
5154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src = fregNo(i->Pin.DfpRound.src);
5155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt r_rmc, r, rmc;
5156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      r_rmc =  i->Pin.DfpRound.r_rmc->Pri.Imm;
5158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      r = (r_rmc & 0x8) >> 3;
5159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      rmc = r_rmc & 0x3;
5160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // drintx
5162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormZ23(p, 59, fr_dst, r, fr_src, rmc, 99, 0);
5163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound128: {
5167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstHi = fregNo(i->Pin.DfpRound128.dst_hi);
5168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstLo = fregNo(i->Pin.DfpRound128.dst_lo);
5169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcHi = fregNo(i->Pin.DfpRound128.src_hi);
5170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcLo = fregNo(i->Pin.DfpRound128.src_lo);
5171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt r_rmc, r, rmc;
5172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      r_rmc =  i->Pin.DfpRound128.r_rmc->Pri.Imm;
5174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      r = (r_rmc & 0x8) >> 3;
5175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      rmc = r_rmc & 0x3;
5176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_srcHi, 72, 0);
5181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_srcLo, 72, 0);
5182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Do drintx instruction with 128-bit source operands in
5184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (12,13).
5185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormZ23(p, 63, 10, r, 12, rmc, 99, 0);
5187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 128-bit result in
5189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (10,11).  Note, the operand in the instruction only
5190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * reference the first of the two registers in the pair.
5191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize: {
5198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst  = fregNo(i->Pin.DfpQuantize.dst);
5199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcL = fregNo(i->Pin.DfpQuantize.srcL);
5200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcR = fregNo(i->Pin.DfpQuantize.srcR);
5201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt rmc;
5202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      rmc =  i->Pin.DfpQuantize.rmc->Pri.Imm;
5204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.DfpQuantize.op) {
5206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DQUA:
5207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ23(p, 59, fr_dst, fr_srcL, fr_srcR, rmc, 3, 0);
5208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_RRDTR:
5210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ23(p, 59, fr_dst, fr_srcL, fr_srcR, rmc, 35, 0);
5211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize128: {
5219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst_hi = fregNo(i->Pin.DfpQuantize128.dst_hi);
5220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst_lo = fregNo(i->Pin.DfpQuantize128.dst_lo);
5221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src_hi = fregNo(i->Pin.DfpQuantize128.src_hi);
5222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src_lo = fregNo(i->Pin.DfpQuantize128.src_lo);
5223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt rmc;
5224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      rmc =  i->Pin.DfpQuantize128.rmc->Pri.Imm;
5226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pairs.  Note, left source operand passed in via the
5228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * dst register pair.
5229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 10, 0, fr_dst_hi, 72, 0);
5231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 11, 0, fr_dst_lo, 72, 0);
5232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_src_hi, 72, 0);
5233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_src_lo, 72, 0);
5234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Do dquaq instruction with 128-bit source operands in
5236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (12,13).
5237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.DfpQuantize128.op) {
5239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DQUAQ:
5240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ23(p, 63, 10, 10, 12, rmc, 3, 0);
5241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DRRNDQ:
5243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ23(p, 63, 10, 10, 12, rmc, 35, 0);
5244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vpanic("Pin_DfpQuantize128: default case, couldn't find inst to issue \n");
5247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 128-bit result in
5251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (10,11).  Note, the operand in the instruction only
5252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * reference the first of the two registers in the pair.
5253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst_hi, 0, 10,  72, 0);
5255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst_lo, 0, 11,  72, 0);
5256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpD128toD64: {
5260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst   = fregNo( i->Pin.DfpD128toD64.dst );
5261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcHi = fregNo( i->Pin.DfpD128toD64.src_hi );
5262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcLo = fregNo( i->Pin.DfpD128toD64.src_lo );
5263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 10, 0, fr_dst, 72, 0 );
5268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 12, 0, fr_srcHi, 72, 0 );
5269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 13, 0, fr_srcLo, 72, 0 );
5270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Do instruction with 128-bit source operands in registers (10,11) */
5272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp128Binary.op) {
5273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DRDPQ:
5274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 0, 12, 770, 0 );
5275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCTFIXQ:
5277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 0, 12, 290, 0 );
5278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 64-bit result in registers 10. */
5284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst, 0, 10,  72, 0);
5285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpI64StoD128: {
5289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstHi = fregNo( i->Pin.DfpI64StoD128.dst_hi );
5290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstLo = fregNo( i->Pin.DfpI64StoD128.dst_lo );
5291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src   = fregNo( i->Pin.DfpI64StoD128.src );
5292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp128Binary.op) {
5294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCFFIXQ:
5295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 11, fr_src, 802, 0 );
5296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 64-bit result in registers 10, 11. */
5302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_InsertExpD128: {
5308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstHi  = fregNo(i->Pin.InsertExpD128.dst_hi);
5309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstLo  = fregNo(i->Pin.InsertExpD128.dst_lo);
5310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcL   = fregNo(i->Pin.InsertExpD128.srcL);
5311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcRHi = fregNo(i->Pin.InsertExpD128.srcR_hi);
5312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcRLo = fregNo(i->Pin.InsertExpD128.srcR_lo);
5313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The left operand is a single F64 value, the right is an F128
5315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 10, 0, fr_srcL, 72, 0);
5318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_srcRHi, 72, 0);
5319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_srcRLo, 72, 0);
5320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 10, 10, 12, 866, 0 );
5321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 128-bit result into
5323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (10,11).  Note, the operand in the instruction only
5324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * reference the first of the two registers in the pair.
5325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Cmp:{
5332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar crfD    = 1;
5333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  r_dst   = iregNo(i->Pin.Dfp64Cmp.dst, mode64);
5334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcL = fregNo(i->Pin.Dfp64Cmp.srcL);
5335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcR = fregNo(i->Pin.Dfp64Cmp.srcR);
5336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(crfD < 8);
5337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // dcmpo, dcmpu
5338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 59, crfD<<2, fr_srcL, fr_srcR, 130, 0);
5339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // mfcr (mv CR to r_dst)
5341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 31, r_dst, 0, 0, 19, 0);
5342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // rlwinm r_dst,r_dst,8,28,31
5344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      //  => rotate field 1 to bottomw of word, masking out upper 28
5345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0);
5346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Cmp: {
5350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar crfD       = 1;
5351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  r_dst      = iregNo(i->Pin.Dfp128Cmp.dst, mode64);
5352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcL_hi = fregNo(i->Pin.Dfp128Cmp.srcL_hi);
5353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcL_lo = fregNo(i->Pin.Dfp128Cmp.srcL_lo);
5354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcR_hi = fregNo(i->Pin.Dfp128Cmp.srcR_hi);
5355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcR_lo = fregNo(i->Pin.Dfp128Cmp.srcR_lo);
5356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(crfD < 8);
5357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // dcmpoq, dcmpuq
5358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 10, 0, fr_srcL_hi, 72, 0);
5362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 11, 0, fr_srcL_lo, 72, 0);
5363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_srcR_hi, 72, 0);
5364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_srcR_lo, 72, 0);
5365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, crfD<<2, 10, 12, 130, 0);
5367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // mfcr (mv CR to r_dst)
5369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 31, r_dst, 0, 0, 19, 0);
5370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // rlwinm r_dst,r_dst,8,28,31
5372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      //  => rotate field 1 to bottomw of word, masking out upper 28
5373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0);
5374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_EvCheck: {
5378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* This requires a 32-bit dec/test in both 32- and 64-bit
5379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         modes. */
5380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We generate:
5381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            lwz     r30, amCounter
5382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            addic.  r30, r30, -1
5383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            stw     r30, amCounter
5384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            bge     nofail
5385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            lwz/ld  r30, amFailAddr
5386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            mtctr   r30
5387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            bctr
5388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           nofail:
5389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      */
5390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* p0 = p;
5391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* lwz r30, amCounter */
5392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_word32(p, True/*isLoad*/, /*r*/30,
5393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  i->Pin.EvCheck.amCounter, mode64);
5394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* addic. r30,r30,-1 */
5395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = emit32(p, 0x37DEFFFF);
5396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* stw r30, amCounter */
5397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_word32(p, False/*!isLoad*/, /*r*/30,
5398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  i->Pin.EvCheck.amCounter, mode64);
5399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bge nofail */
5400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = emit32(p, 0x40800010);
5401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* lwz/ld r30, amFailAddr */
5402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_machine_word(p, True/*isLoad*/, /*r*/30,
5403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        i->Pin.EvCheck.amFailAddr, mode64);
5404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* mtctr r30 */
5405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFX(p, /*r*/30, 9, 467);
5406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bctr */
5407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0);
5408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* nofail: */
5409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Crosscheck */
5411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(evCheckSzB_PPC() == (UChar*)p - (UChar*)p0);
5412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ProfInc: {
5416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We generate:
5417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               (ctrP is unknown now, so use 0x65556555(65556555) in the
5418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               expectation that a later call to LibVEX_patchProfCtr
5419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               will be used to fill in the immediate fields once the
5420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               right value is known.)
5421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            32-bit:
5422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              imm32-exactly r30, 0x65556555
5423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              lwz     r29, 4(r30)
5424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              addic.  r29, r29, 1
5425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              stw     r29, 4(r30)
5426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              lwz     r29, 0(r30)
5427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              addze   r29, r29
5428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              stw     r29, 0(r30)
5429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            64-bit:
5430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              imm64-exactly r30, 0x6555655565556555
5431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              ld      r29, 0(r30)
5432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              addi    r29, r29, 1
5433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              std     r29, 0(r30)
5434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      */
5435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (mode64) {
5436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkLoadImm_EXACTLY2or5(
5437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                p, /*r*/30, 0x6555655565556555ULL, True/*mode64*/);
5438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0xEBBE0000);
5439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x3BBD0001);
5440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0xFBBE0000);
5441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
5442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkLoadImm_EXACTLY2or5(
5443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                p, /*r*/30, 0x65556555ULL, False/*!mode64*/);
5444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x83BE0004);
5445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x37BD0001);
5446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x93BE0004);
5447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x83BE0000);
5448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x7FBD0194);
5449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x93BE0000);
5450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Tell the caller .. */
5452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(!(*is_profInc));
5453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      *is_profInc = True;
5454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
5458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto bad;
5459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  bad:
5462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_printf("\n=> ");
5463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ppPPCInstr(i, mode64);
5464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vpanic("emit_PPCInstr");
5465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*NOTREACHED*/
5466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  done:
5468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(p - &buf[0] <= 64);
5469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p - &buf[0];
5470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check?  See case for Pin_EvCheck in
5474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   emit_PPCInstr just above.  That crosschecks what this returns, so
5475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   we can tell if we're inconsistent. */
5476663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt evCheckSzB_PPC ( void )
5477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  return 28;
5479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the
5483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   emitInstr case for XDirect, above. */
5484663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange chainXDirect_PPC ( void* place_to_chain,
5485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 void* disp_cp_chain_me_EXPECTED,
5486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 void* place_to_jump_to,
5487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 Bool  mode64 )
5488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* What we're expecting to see is:
5490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        imm32/64-fixed r30, disp_cp_chain_me_to_EXPECTED
5491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        mtctr r30
5492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        bctrl
5493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      viz
5494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5>
5495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        7F C9 03 A6
5496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        4E 80 04 21
5497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
5498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UChar* p = (UChar*)place_to_chain;
5499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(0 == (3 & (HWord)p));
5500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(isLoadImm_EXACTLY2or5(p, /*r*/30,
5501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 Ptr_to_ULong(disp_cp_chain_me_EXPECTED),
5502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 mode64));
5503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x7FC903A6);
5504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x4E800421);
5505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* And what we want to change it to is:
5506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        imm32/64-fixed r30, place_to_jump_to
5507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        mtctr r30
5508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        bctr
5509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      viz
5510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5>
5511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        7F C9 03 A6
5512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        4E 80 04 20
5513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      The replacement has the same length as the original.
5514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
5515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = mkLoadImm_EXACTLY2or5(p, /*r*/30,
5516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             Ptr_to_ULong(place_to_jump_to), mode64);
5517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = emit32(p, 0x7FC903A6);
5518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = emit32(p, 0x4E800420);
5519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int len = p - (UChar*)place_to_chain;
5521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(len == (mode64 ? 28 : 16)); /* stay sane */
5522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VexInvalRange vir = {(HWord)place_to_chain, len};
5523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return vir;
5524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the
5528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   emitInstr case for XDirect, above. */
5529663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange unchainXDirect_PPC ( void* place_to_unchain,
5530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   void* place_to_jump_to_EXPECTED,
5531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   void* disp_cp_chain_me,
5532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   Bool  mode64 )
5533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* What we're expecting to see is:
5535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        imm32/64-fixed r30, place_to_jump_to_EXPECTED
5536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        mtctr r30
5537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        bctr
5538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      viz
5539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5>
5540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        7F C9 03 A6
5541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        4E 80 04 20
5542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
5543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UChar* p = (UChar*)place_to_unchain;
5544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(0 == (3 & (HWord)p));
5545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(isLoadImm_EXACTLY2or5(p, /*r*/30,
5546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 Ptr_to_ULong(place_to_jump_to_EXPECTED),
5547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 mode64));
5548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x7FC903A6);
5549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x4E800420);
5550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* And what we want to change it to is:
5551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        imm32/64-fixed r30, disp_cp_chain_me
5552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        mtctr r30
5553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        bctrl
5554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      viz
5555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5>
5556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        7F C9 03 A6
5557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        4E 80 04 21
5558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      The replacement has the same length as the original.
5559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
5560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = mkLoadImm_EXACTLY2or5(p, /*r*/30,
5561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             Ptr_to_ULong(disp_cp_chain_me), mode64);
5562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = emit32(p, 0x7FC903A6);
5563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = emit32(p, 0x4E800421);
5564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int len = p - (UChar*)place_to_unchain;
5566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(len == (mode64 ? 28 : 16)); /* stay sane */
5567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VexInvalRange vir = {(HWord)place_to_unchain, len};
5568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return vir;
5569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter address into a profile inc point, as previously
5573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   created by the Pin_ProfInc case for emit_PPCInstr. */
5574663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange patchProfInc_PPC ( void*  place_to_patch,
5575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 ULong* location_of_counter,
5576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 Bool   mode64 )
5577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UChar* p = (UChar*)place_to_patch;
5579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(0 == (3 & (HWord)p));
5580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int len = 0;
5582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (mode64) {
5583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(isLoadImm_EXACTLY2or5(p, /*r*/30,
5584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    0x6555655565556555ULL, True/*mode64*/));
5585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 20) == 0xEBBE0000);
5586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 24) == 0x3BBD0001);
5587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 28) == 0xFBBE0000);
5588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm_EXACTLY2or5(p, /*r*/30,
5589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                Ptr_to_ULong(location_of_counter),
5590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                True/*mode64*/);
5591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      len = p - (UChar*)place_to_patch;
5592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(len == 20);
5593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
5594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(isLoadImm_EXACTLY2or5(p, /*r*/30,
5595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    0x65556555ULL, False/*!mode64*/));
5596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p +  8) == 0x83BE0004);
5597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 12) == 0x37BD0001);
5598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 16) == 0x93BE0004);
5599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 20) == 0x83BE0000);
5600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 24) == 0x7FBD0194);
5601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 28) == 0x93BE0000);
5602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm_EXACTLY2or5(p, /*r*/30,
5603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                Ptr_to_ULong(location_of_counter),
5604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                False/*!mode64*/);
5605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      len = p - (UChar*)place_to_patch;
5606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(len == 8);
5607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VexInvalRange vir = {(HWord)place_to_patch, len};
5609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return vir;
5610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
5614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                     host_ppc_defs.c ---*/
5615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
5616