host_ppc_defs.c revision eb0bae136f4eeaaf29761dddb148b118fb824632
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
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2004-2013 OpenWorks LLP
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      info@open-works.net
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02110-1301, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Neither the names of the U.S. Department of Energy nor the
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   University of California nor the names of its contributors may be
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   used to endorse or promote products derived from this software
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   without prior written permission.
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#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;
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   static const 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
276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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
575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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
586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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
597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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
609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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
658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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 */
677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_ADDU:      return "vaddu_m";  // b,h,w,dw
678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_QADDU:     return "vaddu_s";  // b,h,w,dw
679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_QADDS:     return "vadds_s";  // b,h,w,dw
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_SUBU:      return "vsubu_m";  // b,h,w,dw
682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_QSUBU:     return "vsubu_s";  // b,h,w,dw
683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_QSUBS:     return "vsubs_s";  // b,h,w,dw
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_MULU:      return "vmulu";    // w
686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_OMULU:     return "vmulou";   // b,h,w
687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_OMULS:     return "vmulos";   // b,h,w
688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_EMULU:     return "vmuleu";   // b,h,w
689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_EMULS:     return "vmules";   // b,h,w
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_AVGU:      return "vavgu";    // b,h,w
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_AVGS:      return "vavgs";    // b,h,w
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MAXU:      return "vmaxu";    // b,h,w
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MAXS:      return "vmaxs";    // b,h,w
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MINU:      return "vminu";    // b,h,w
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MINS:      return "vmins";    // b,h,w
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Compare (always affects CR field 6) */
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_CMPEQU:    return "vcmpequ";  // b,h,w
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_CMPGTU:    return "vcmpgtu";  // b,h,w
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_CMPGTS:    return "vcmpgts";  // b,h,w
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Shift */
706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_SHL:       return "vsl";      // ' ',b,h,w,dw
707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_SHR:       return "vsr";      // ' ',b,h,w,dw
708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_SAR:       return "vsra";     // b,h,w,dw
709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_ROTL:      return "vrl";      // b,h,w,dw
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Pack */
712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_PACKUU:    return "vpku_um";  // h,w,dw
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QPACKUU:   return "vpku_us";  // h,w
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QPACKSU:   return "vpks_us";  // h,w
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_QPACKSS:   return "vpks_ss";  // h,w
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_PACKPXL:   return "vpkpx";
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Merge */
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MRGHI:     return "vmrgh";    // b,h,w
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pav_MRGLO:     return "vmrgl";    // b,h,w
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Concatenation */
723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_CATODD:     return "vmrgow";    // w
724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_CATEVEN:    return "vmrgew";    // w
725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* SHA */
727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_SHA256:     return "vshasigmaw"; // w
728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_SHA512:     return "vshasigmaw"; // dw
729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* BCD */
731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_BCDAdd:     return "bcdadd.";  // qw
732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_BCDSub:     return "bcdsub.";  // qw
733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Polynomial arith */
735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_POLYMULADD: return "vpmsum";   // b, h, w, d
736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Cipher */
738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_CIPHERV128:  case Pav_CIPHERLV128:
739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_NCIPHERV128: case Pav_NCIPHERLV128:
740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_CIPHERSUBV128: return "v_cipher_";  // qw
741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* zero count */
743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_ZEROCNTBYTE: case Pav_ZEROCNTWORD:
744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_ZEROCNTHALF: case Pav_ZEROCNTDBL:
745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return "vclz_";                           // b, h, w, d
746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* vector gather (byte-by-byte bit matrix transpose) */
748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pav_BITMTXXPOSE:
749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return "vgbbd";
750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default: vpanic("showPPCAvOp");
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* showPPCAvFpOp ( PPCAvFpOp op ) {
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (op) {
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Floating Point Binary */
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ADDF:      return "vaddfp";
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_SUBF:      return "vsubfp";
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_MULF:      return "vmaddfp";
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_MAXF:      return "vmaxfp";
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_MINF:      return "vminfp";
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CMPEQF:    return "vcmpeqfp";
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CMPGTF:    return "vcmpgtfp";
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CMPGEF:    return "vcmpgefp";
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Floating Point Unary */
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_RCPF:      return "vrefp";
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_RSQRTF:    return "vrsqrtefp";
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CVTU2F:    return "vcfux";
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_CVTS2F:    return "vcfsx";
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_QCVTF2U:   return "vctuxs";
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_QCVTF2S:   return "vctsxs";
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ROUNDM:    return "vrfim";
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ROUNDP:    return "vrfip";
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ROUNDN:    return "vrfin";
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pavfp_ROUNDZ:    return "vrfiz";
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default: vpanic("showPPCAvFpOp");
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_LI ( HReg dst, ULong imm64, Bool mode64 )
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i     = LibVEX_Alloc(sizeof(PPCInstr));
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag          = Pin_LI;
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LI.dst   = dst;
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LI.imm64 = imm64;
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!mode64)
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert( (Long)imm64 == (Long)(Int)(UInt)imm64 );
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Alu ( PPCAluOp op, HReg dst,
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         HReg srcL, PPCRH* srcR ) {
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i     = LibVEX_Alloc(sizeof(PPCInstr));
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag          = Pin_Alu;
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Alu.op   = op;
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Alu.dst  = dst;
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Alu.srcL = srcL;
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Alu.srcR = srcR;
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Shft ( PPCShftOp op, Bool sz32,
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          HReg dst, HReg srcL, PPCRH* srcR ) {
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Shft;
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.op   = op;
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.sz32 = sz32;
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.dst  = dst;
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.srcL = srcL;
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Shft.srcR = srcR;
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AddSubC ( Bool isAdd, Bool setC,
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             HReg dst, HReg srcL, HReg srcR ) {
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_AddSubC;
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.isAdd = isAdd;
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.setC  = setC;
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.dst   = dst;
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.srcL  = srcL;
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AddSubC.srcR  = srcR;
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Cmp ( Bool syned, Bool sz32,
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt crfD, HReg srcL, PPCRH* srcR ) {
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Cmp;
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.syned = syned;
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.sz32  = sz32;
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.crfD  = crfD;
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.srcL  = srcL;
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Cmp.srcR  = srcR;
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Unary ( PPCUnaryOp op, HReg dst, HReg src ) {
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Unary;
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Unary.op  = op;
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Unary.dst = dst;
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Unary.src = src;
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MulL ( Bool syned, Bool hi, Bool sz32,
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          HReg dst, HReg srcL, HReg srcR ) {
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_MulL;
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.syned = syned;
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.hi    = hi;
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.sz32  = sz32;
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.dst   = dst;
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.srcL  = srcL;
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MulL.srcR  = srcR;
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* if doing the low word, the signedness is irrelevant, but tie it
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      down anyway. */
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!hi) vassert(!syned);
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_Div ( Bool extended, Bool syned, Bool sz32,
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         HReg dst, HReg srcL, HReg srcR ) {
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Div;
863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   i->Pin.Div.extended = extended;
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.syned = syned;
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.sz32  = sz32;
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.dst   = dst;
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.srcL  = srcL;
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Div.srcR  = srcR;
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Call ( PPCCondCode cond,
872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          Addr64 target, UInt argiregs, RetLoc rloc ) {
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt mask;
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_Call;
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Call.cond     = cond;
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Call.target   = target;
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Call.argiregs = argiregs;
879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.Call.rloc     = rloc;
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Only r3 .. r10 inclusive may be used as arg regs. Hence: */
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   mask = (1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10);
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(0 == (argiregs & ~mask));
883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(is_sane_RetLoc(rloc));
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
886663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XDirect ( Addr64 dstGA, PPCAMode* amCIA,
887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             PPCCondCode cond, Bool toFastEP ) {
888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i             = LibVEX_Alloc(sizeof(PPCInstr));
889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                  = Pin_XDirect;
890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XDirect.dstGA    = dstGA;
891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XDirect.amCIA    = amCIA;
892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XDirect.cond     = cond;
893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XDirect.toFastEP = toFastEP;
894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
896663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XIndir ( HReg dstGA, PPCAMode* amCIA,
897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            PPCCondCode cond ) {
898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i         = LibVEX_Alloc(sizeof(PPCInstr));
899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag              = Pin_XIndir;
900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XIndir.dstGA = dstGA;
901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XIndir.amCIA = amCIA;
902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XIndir.cond  = cond;
903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
905663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XAssisted ( HReg dstGA, PPCAMode* amCIA,
906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               PPCCondCode cond, IRJumpKind jk ) {
907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i            = LibVEX_Alloc(sizeof(PPCInstr));
908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                 = Pin_XAssisted;
909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XAssisted.dstGA = dstGA;
910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XAssisted.amCIA = amCIA;
911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XAssisted.cond  = cond;
912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.XAssisted.jk    = jk;
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_CMov  ( PPCCondCode cond,
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           HReg dst, PPCRI* src ) {
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_CMov;
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.CMov.cond = cond;
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.CMov.src  = src;
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.CMov.dst  = dst;
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(cond.test != Pct_ALWAYS);
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Load ( UChar sz,
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          HReg dst, PPCAMode* src, Bool mode64 ) {
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_Load;
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Load.sz    = sz;
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Load.src   = src;
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Load.dst   = dst;
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8);
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sz == 8) vassert(mode64);
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_LoadL ( UChar sz,
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           HReg dst, HReg src, Bool mode64 )
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_LoadL;
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LoadL.sz   = sz;
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LoadL.src  = src;
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.LoadL.dst  = dst;
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 4 || sz == 8);
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sz == 8) vassert(mode64);
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Store ( UChar sz, PPCAMode* dst, HReg src,
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           Bool mode64 ) {
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_Store;
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Store.sz  = sz;
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Store.src = src;
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Store.dst = dst;
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8);
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sz == 8) vassert(mode64);
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_StoreC ( UChar sz, HReg dst, HReg src, Bool mode64 ) {
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_StoreC;
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.StoreC.sz  = sz;
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.StoreC.src = src;
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.StoreC.dst = dst;
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 4 || sz == 8);
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (sz == 8) vassert(mode64);
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Set ( PPCCondCode cond, HReg dst ) {
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i     = LibVEX_Alloc(sizeof(PPCInstr));
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag          = Pin_Set;
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Set.cond = cond;
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.Set.dst  = dst;
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MfCR ( HReg dst )
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i     = LibVEX_Alloc(sizeof(PPCInstr));
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag          = Pin_MfCR;
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.MfCR.dst = dst;
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MFence ( void )
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr));
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag      = Pin_MFence;
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpUnary ( PPCFpOp op, HReg dst, HReg src ) {
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_FpUnary;
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpUnary.op  = op;
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpUnary.dst = dst;
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpUnary.src = src;
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpBinary ( PPCFpOp op, HReg dst,
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              HReg srcL, HReg srcR ) {
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_FpBinary;
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpBinary.op   = op;
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpBinary.dst  = dst;
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpBinary.srcL = srcL;
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpBinary.srcR = srcR;
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpMulAcc ( PPCFpOp op, HReg dst, HReg srcML,
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          HReg srcMR, HReg srcAcc )
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i            = LibVEX_Alloc(sizeof(PPCInstr));
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                 = Pin_FpMulAcc;
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.op     = op;
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.dst    = dst;
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.srcML  = srcML;
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.srcMR  = srcMR;
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpMulAcc.srcAcc = srcAcc;
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpLdSt ( Bool isLoad, UChar sz,
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg reg, PPCAMode* addr ) {
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_FpLdSt;
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdSt.isLoad = isLoad;
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdSt.sz     = sz;
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdSt.reg    = reg;
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdSt.addr   = addr;
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(sz == 4 || sz == 8);
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpSTFIW ( HReg addr, HReg data )
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i         = LibVEX_Alloc(sizeof(PPCInstr));
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag              = Pin_FpSTFIW;
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpSTFIW.addr = addr;
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpSTFIW.data = data;
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpRSP ( HReg dst, HReg src ) {
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i      = LibVEX_Alloc(sizeof(PPCInstr));
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag           = Pin_FpRSP;
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpRSP.dst = dst;
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpRSP.src = src;
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Unary(PPCFpOp op, HReg dst, HReg src) {
1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) );
1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag = Pin_Dfp64Unary;
1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Unary.op = op;
1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Unary.dst = dst;
1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Unary.src = src;
1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Binary(PPCFpOp op, HReg dst, HReg srcL, HReg srcR) {
1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) );
1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag = Pin_Dfp64Binary;
1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Binary.op = op;
1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Binary.dst = dst;
1059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Binary.srcL = srcL;
1060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Binary.srcR = srcR;
1061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1063663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpShift ( PPCFpOp op, HReg dst, HReg src, PPCRI* shift ) {
1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i            = LibVEX_Alloc(sizeof(PPCInstr));
1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                 = Pin_DfpShift;
1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift.op     = op;
1067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift.shift  = shift;
1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift.src    = src;
1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift.dst    = dst;
1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1072663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Unary(PPCFpOp op, HReg dst_hi, HReg dst_lo,
1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                HReg src_hi, HReg src_lo) {
1074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) );
1075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag = Pin_Dfp128Unary;
1076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.op = op;
1077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.dst_hi = dst_hi;
1078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.dst_lo = dst_lo;
1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.src_hi = src_hi;
1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Unary.src_lo = src_lo;
1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Binary(PPCFpOp op, HReg dst_hi, HReg dst_lo,
1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                HReg srcR_hi, HReg srcR_lo) {
1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* dst is used to pass the srcL argument and return the result */
1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) );
1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag = Pin_Dfp128Binary;
1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.op = op;
1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.dst_hi = dst_hi;
1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.dst_lo = dst_lo;
1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.srcR_hi = srcR_hi;
1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Binary.srcR_lo = srcR_lo;
1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpShift128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 HReg src_hi, HReg src_lo,
1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 PPCRI* shift ) {
1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i               = LibVEX_Alloc(sizeof(PPCInstr));
1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                    = Pin_DfpShift128;
1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.op     = op;
1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.shift  = shift;
1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.src_hi = src_hi;
1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.src_lo = src_lo;
1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.dst_hi = dst_hi;
1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpShift128.dst_lo = dst_lo;
1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpRound ( HReg dst, HReg src, PPCRI* r_rmc ) {
1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                = Pin_DfpRound;
1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound.dst   = dst;
1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound.src   = src;
1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound.r_rmc = r_rmc;
1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpRound128 ( HReg dst_hi, HReg dst_lo, HReg src_hi,
1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 HReg src_lo, PPCRI* r_rmc ) {
1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i               = LibVEX_Alloc(sizeof(PPCInstr));
1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                    = Pin_DfpRound128;
1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.dst_hi = dst_hi;
1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.dst_lo = dst_lo;
1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.src_hi = src_hi;
1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.src_lo = src_lo;
1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpRound128.r_rmc  = r_rmc;
1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpQuantize ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR,
1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 PPCRI* rmc ) {
1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i             = LibVEX_Alloc(sizeof(PPCInstr));
1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                  = Pin_DfpQuantize;
1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.op   = op;
1132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.dst  = dst;
1133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.srcL = srcL;
1134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.srcR = srcR;
1135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize.rmc  = rmc;
1136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    HReg src_hi, HReg src_lo, PPCRI* rmc ) {
1140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* dst is used to pass left operand in and return result */
1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                  = LibVEX_Alloc(sizeof(PPCInstr));
1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                       = Pin_DfpQuantize128;
1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.op     = op;
1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.dst_hi = dst_hi;
1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.dst_lo = dst_lo;
1146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.src_hi = src_hi;
1147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.src_lo = src_lo;
1148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpQuantize128.rmc    = rmc;
1149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst,
1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  HReg src_hi, HReg src_lo ) {
1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                = LibVEX_Alloc(sizeof(PPCInstr));
1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                     = Pin_DfpD128toD64;
1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpD128toD64.op     = op;
1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpD128toD64.src_hi = src_hi;
1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpD128toD64.src_lo = src_lo;
1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpD128toD64.dst    = dst;
1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpI64StoD128 ( PPCFpOp op, HReg dst_hi,
1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   HReg dst_lo, HReg src ) {
1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                 = LibVEX_Alloc(sizeof(PPCInstr));
1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                      = Pin_DfpI64StoD128;
1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpI64StoD128.op     = op;
1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpI64StoD128.src    = src;
1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpI64StoD128.dst_hi = dst_hi;
1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.DfpI64StoD128.dst_lo = dst_lo;
1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op, HReg dst,
1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    HReg src_hi, HReg src_lo ) {
1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* dst is used to pass the srcL argument */
1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                  = LibVEX_Alloc(sizeof(PPCInstr));
1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                       = Pin_ExtractExpD128;
1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.ExtractExpD128.op     = op;
1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.ExtractExpD128.dst    = dst;
1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.ExtractExpD128.src_hi = src_hi;
1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.ExtractExpD128.src_lo = src_lo;
1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_InsertExpD128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   HReg srcL, HReg srcR_hi, HReg srcR_lo ) {
1184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* dst is used to pass the srcL argument */
1185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i                  = LibVEX_Alloc(sizeof(PPCInstr));
1186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                       = Pin_InsertExpD128;
1187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.op      = op;
1188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.dst_hi  = dst_hi;
1189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.dst_lo  = dst_lo;
1190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.srcL    = srcL;
1191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.srcR_hi = srcR_hi;
1192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.InsertExpD128.srcR_lo = srcR_lo;
1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1195663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Cmp (/* UInt crfD,*/ HReg dst, HReg srcL, HReg srcR ) {
1196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag               = Pin_Dfp64Cmp;
1198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Cmp.dst = dst;
1199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Cmp.srcL = srcL;
1200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp64Cmp.srcR = srcR;
1201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1203663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Cmp ( HReg dst, HReg srcL_hi, HReg srcL_lo,
1204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               HReg srcR_hi, HReg srcR_lo ) {
1205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i               = LibVEX_Alloc(sizeof(PPCInstr));
1206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                    = Pin_Dfp128Cmp;
1207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.dst      = dst;
1208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.srcL_hi  = srcL_hi;
1209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.srcL_lo  = srcL_lo;
1210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.srcR_hi  = srcR_hi;
1211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.Dfp128Cmp.srcR_lo  = srcR_lo;
1212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1214663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_EvCheck ( PPCAMode* amCounter,
1215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             PPCAMode* amFailAddr ) {
1216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i               = LibVEX_Alloc(sizeof(PPCInstr));
1217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag                    = Pin_EvCheck;
1218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.EvCheck.amCounter  = amCounter;
1219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.EvCheck.amFailAddr = amFailAddr;
1220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1222663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_ProfInc ( void ) {
1223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr));
1224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->tag      = Pin_ProfInc;
1225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return i;
1226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovValid combo | fromI | int32 | syned | flt64 |
1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  n       n       n       n    |
1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I64U  |  n       n       n       y    |
1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  n       n       y       n    |
1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I64S  |  n       n       y       y    |
1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  n       y       n       n    |
1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I32U  |  n       y       n       y    |
1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  n       y       y       n    |
1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I32S  |  n       y       y       y    |
1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64U->F32  |  y       n       n       n    |
1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64U->F64  |  y       n       n       y    |
1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       n       y       n    |
1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64S->F64  |  y       n       y       y    |
1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       y       n       n    |
1256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       y       n       y    |
1258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       y       y       n    |
1260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            |  y       y       y       y    |
1262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov--------------------------------------------
1263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned,
1265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            Bool flt64, HReg dst, HReg src ) {
1266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Bool tmp = fromI | int32 | syned | flt64;
1267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(tmp == True || tmp == False); // iow, no high bits set
1268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort conversion = 0;
1269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   conversion = (fromI << 3) | (int32 << 2) | (syned << 1) | flt64;
1270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (conversion) {
1271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      // Supported conversion operations
1272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 1: case 3: case 5: case 7:
1273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 8: case 9: case 11:
1274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      default:
1276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vpanic("PPCInstr_FpCftI(ppc_host)");
1277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i         = LibVEX_Alloc(sizeof(PPCInstr));
1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag              = Pin_FpCftI;
1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCftI.fromI = fromI;
1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCftI.int32 = int32;
1282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   i->Pin.FpCftI.syned = syned;
1283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   i->Pin.FpCftI.flt64 = flt64;
1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCftI.dst   = dst;
1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCftI.src   = src;
1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpCMov ( PPCCondCode cond, HReg dst, HReg src ) {
1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_FpCMov;
1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCMov.cond = cond;
1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCMov.dst  = dst;
1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCMov.src  = src;
1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(cond.test != Pct_ALWAYS);
1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1297663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_FpLdFPSCR ( HReg src, Bool dfp_rm ) {
1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_FpLdFPSCR;
1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpLdFPSCR.src = src;
1301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   i->Pin.FpLdFPSCR.dfp_rm = dfp_rm ? 1 : 0;
1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpCmp ( HReg dst, HReg srcL, HReg srcR ) {
1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_FpCmp;
1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCmp.dst  = dst;
1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCmp.srcL = srcL;
1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.FpCmp.srcR = srcR;
1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Read/Write Link Register */
1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_RdWrLR ( Bool wrLR, HReg gpr ) {
1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_RdWrLR;
1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.RdWrLR.wrLR = wrLR;
1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.RdWrLR.gpr  = gpr;
1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* AltiVec */
1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvLdSt ( Bool isLoad, UChar sz,
1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            HReg reg, PPCAMode* addr ) {
1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_AvLdSt;
1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdSt.isLoad = isLoad;
1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdSt.sz     = sz;
1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdSt.reg    = reg;
1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdSt.addr   = addr;
1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvUnary ( PPCAvOp op, HReg dst, HReg src ) {
1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_AvUnary;
1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUnary.op  = op;
1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUnary.dst = dst;
1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUnary.src = src;
1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBinary ( PPCAvOp op, HReg dst,
1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              HReg srcL, HReg srcR ) {
1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_AvBinary;
1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBinary.op   = op;
1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBinary.dst  = dst;
1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBinary.srcL = srcL;
1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBinary.srcR = srcR;
1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin8x16 ( PPCAvOp op, HReg dst,
1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               HReg srcL, HReg srcR ) {
1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                = Pin_AvBin8x16;
1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin8x16.op   = op;
1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin8x16.dst  = dst;
1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin8x16.srcL = srcL;
1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin8x16.srcR = srcR;
1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin16x8 ( PPCAvOp op, HReg dst,
1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               HReg srcL, HReg srcR ) {
1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                = Pin_AvBin16x8;
1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin16x8.op   = op;
1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin16x8.dst  = dst;
1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin16x8.srcL = srcL;
1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin16x8.srcR = srcR;
1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin32x4 ( PPCAvOp op, HReg dst,
1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               HReg srcL, HReg srcR ) {
1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                = Pin_AvBin32x4;
1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32x4.op   = op;
1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32x4.dst  = dst;
1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32x4.srcL = srcL;
1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32x4.srcR = srcR;
1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvBin64x2 ( PPCAvOp op, HReg dst,
1382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               HReg srcL, HReg srcR ) {
1383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                = Pin_AvBin64x2;
1385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvBin64x2.op   = op;
1386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvBin64x2.dst  = dst;
1387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvBin64x2.srcL = srcL;
1388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvBin64x2.srcR = srcR;
1389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst,
1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                HReg srcL, HReg srcR ) {
1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i            = LibVEX_Alloc(sizeof(PPCInstr));
1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                 = Pin_AvBin32Fx4;
1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32Fx4.op   = op;
1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32Fx4.dst  = dst;
1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32Fx4.srcL = srcL;
1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvBin32Fx4.srcR = srcR;
1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_AvUn32Fx4 ( PPCAvFpOp op, HReg dst, HReg src ) {
1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i          = LibVEX_Alloc(sizeof(PPCInstr));
1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag               = Pin_AvUn32Fx4;
1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUn32Fx4.op  = op;
1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUn32Fx4.dst = dst;
1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvUn32Fx4.src = src;
1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvPerm ( HReg dst, HReg srcL, HReg srcR, HReg ctl ) {
1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_AvPerm;
1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvPerm.dst  = dst;
1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvPerm.srcL = srcL;
1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvPerm.srcR = srcR;
1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvPerm.ctl  = ctl;
1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvSel ( HReg ctl, HReg dst, HReg srcL, HReg srcR ) {
1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i       = LibVEX_Alloc(sizeof(PPCInstr));
1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag            = Pin_AvSel;
1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSel.ctl  = ctl;
1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSel.dst  = dst;
1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSel.srcL = srcL;
1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSel.srcR = srcR;
1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvShlDbl ( UChar shift, HReg dst,
1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              HReg srcL, HReg srcR ) {
1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i           = LibVEX_Alloc(sizeof(PPCInstr));
1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag                = Pin_AvShlDbl;
1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvShlDbl.shift = shift;
1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvShlDbl.dst   = dst;
1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvShlDbl.srcL  = srcL;
1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvShlDbl.srcR  = srcR;
1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvSplat ( UChar sz, HReg dst, PPCVI5s* src ) {
1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_AvSplat;
1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSplat.sz  = sz;
1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSplat.dst = dst;
1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvSplat.src = src;
1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvCMov ( PPCCondCode cond, HReg dst, HReg src ) {
1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i        = LibVEX_Alloc(sizeof(PPCInstr));
1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag             = Pin_AvCMov;
1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvCMov.cond = cond;
1451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvCMov.dst  = dst;
1452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvCMov.src  = src;
1453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(cond.test != Pct_ALWAYS);
1454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvLdVSCR ( HReg src ) {
1457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCInstr* i         = LibVEX_Alloc(sizeof(PPCInstr));
1458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->tag              = Pin_AvLdVSCR;
1459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   i->Pin.AvLdVSCR.src = src;
1460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return i;
1461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvCipherV128Unary ( PPCAvOp op, HReg dst, HReg src ) {
1463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PPCInstr* i              = LibVEX_Alloc(sizeof(PPCInstr));
1464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = Pin_AvCipherV128Unary;
1465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvCipherV128Unary.op   = op;
1466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvCipherV128Unary.dst  = dst;
1467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvCipherV128Unary.src  = src;
1468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvCipherV128Binary ( PPCAvOp op, HReg dst,
1471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        HReg srcL, HReg srcR ) {
1472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PPCInstr* i              = LibVEX_Alloc(sizeof(PPCInstr));
1473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = Pin_AvCipherV128Binary;
1474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvCipherV128Binary.op   = op;
1475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvCipherV128Binary.dst  = dst;
1476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvCipherV128Binary.srcL = srcL;
1477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvCipherV128Binary.srcR = srcR;
1478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvHashV128Binary ( PPCAvOp op, HReg dst,
1481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      HReg src, PPCRI* s_field ) {
1482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PPCInstr* i              = LibVEX_Alloc(sizeof(PPCInstr));
1483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag                   = Pin_AvHashV128Binary;
1484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvHashV128Binary.op  = op;
1485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvHashV128Binary.dst = dst;
1486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvHashV128Binary.src = src;
1487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvHashV128Binary.s_field = s_field;
1488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvBCDV128Trinary ( PPCAvOp op, HReg dst,
1491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      HReg src1, HReg src2, PPCRI* ps ) {
1492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr));
1493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->tag      = Pin_AvBCDV128Trinary;
1494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvBCDV128Trinary.op   = op;
1495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvBCDV128Trinary.dst  = dst;
1496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvBCDV128Trinary.src1 = src1;
1497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvBCDV128Trinary.src2 = src2;
1498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   i->Pin.AvBCDV128Trinary.ps   = ps;
1499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return i;
1500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Pretty Print instructions */
1504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void ppLoadImm ( HReg dst, ULong imm, Bool mode64 ) {
1505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_printf("li_word ");
1506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ppHRegPPC(dst);
1507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!mode64) {
1508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",0x%08x", (UInt)imm);
1509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
1510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",0x%016llx", imm);
1511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void ppMovReg ( HReg dst, HReg src ) {
1515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (hregNumber(dst) != hregNumber(src)) {
1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mr ");
1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(dst);
1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(src);
1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCInstr ( PPCInstr* i, Bool mode64 )
1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (i->tag) {
1526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LI:
1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppLoadImm(i->Pin.LI.dst, i->Pin.LI.imm64, mode64);
1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Alu: {
1530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      HReg   r_srcL  = i->Pin.Alu.srcL;
1531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* rh_srcR = i->Pin.Alu.srcR;
1532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* special-case "mr" */
1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Alu.op == Palu_OR &&   // or Rd,Rs,Rs == mr Rd,Rs
1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          rh_srcR->tag == Prh_Reg &&
1535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          sameHReg(rh_srcR->Prh.Reg.reg, r_srcL)) {
1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("mr ");
1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.Alu.dst);
1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",");
1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(r_srcL);
1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* special-case "li" */
1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Alu.op == Palu_ADD &&   // addi Rd,0,imm == li Rd,imm
1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          rh_srcR->tag == Prh_Imm &&
1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          hregNumber(r_srcL) == 0) {
1546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("li ");
1547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.Alu.dst);
1548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",");
1549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppPPCRH(rh_srcR);
1550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
1551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* generic */
1553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAluOp(i->Pin.Alu.op,
1554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     toBool(rh_srcR->tag == Prh_Imm)));
1555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Alu.dst);
1556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(r_srcL);
1558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCRH(rh_srcR);
1560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Shft: {
1563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      HReg   r_srcL  = i->Pin.Shft.srcL;
1564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* rh_srcR = i->Pin.Shft.srcR;
1565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCShftOp(i->Pin.Shft.op,
1566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      toBool(rh_srcR->tag == Prh_Imm),
1567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      i->Pin.Shft.sz32));
1568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Shft.dst);
1569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(r_srcL);
1571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCRH(rh_srcR);
1573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AddSubC:
1576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s%s ",
1577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.AddSubC.isAdd ? "add" : "sub",
1578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.AddSubC.setC ? "c" : "e");
1579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AddSubC.dst);
1580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AddSubC.srcL);
1582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AddSubC.srcR);
1584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Cmp:
1586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s%c%s %%cr%u,",
1587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Cmp.syned ? "cmp" : "cmpl",
1588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Cmp.sz32 ? 'w' : 'd',
1589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Cmp.srcR->tag == Prh_Imm ? "i" : "",
1590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Cmp.crfD);
1591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Cmp.srcL);
1592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCRH(i->Pin.Cmp.srcR);
1594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Unary:
1596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCUnaryOp(i->Pin.Unary.op));
1597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Unary.dst);
1598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Unary.src);
1600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MulL:
1602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mul%c%c%s ",
1603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.MulL.hi ? 'h' : 'l',
1604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.MulL.sz32 ? 'w' : 'd',
1605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.MulL.hi ? (i->Pin.MulL.syned ? "s" : "u") : "");
1606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.MulL.dst);
1607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.MulL.srcL);
1609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.MulL.srcR);
1611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Div:
1613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("div%c%s%s ",
1614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Div.sz32 ? 'w' : 'd',
1615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 i->Pin.Div.extended ? "e" : "",
1616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.Div.syned ? "" : "u");
1617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Div.dst);
1618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Div.srcL);
1620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Div.srcR);
1622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Call: {
1624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int n;
1625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("call: ");
1626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Call.cond.test != Pct_ALWAYS) {
1627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("if (%s) ", showPPCCondCode(i->Pin.Call.cond));
1628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("{ ");
1630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppLoadImm(hregPPC_GPR10(mode64), i->Pin.Call.target, mode64);
1631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(" ; mtctr r10 ; bctrl [");
1632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (n = 0; n < 32; n++) {
1633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (i->Pin.Call.argiregs & (1<<n)) {
1634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vex_printf("r%d", n);
1635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if ((i->Pin.Call.argiregs >> n) > 1)
1636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vex_printf(",");
1637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
1638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
1640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppRetLoc(i->Pin.Call.rloc);
1641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("] }");
1642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XDirect:
1645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("(xDirect) ");
1646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("if (%s) { ",
1647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 showPPCCondCode(i->Pin.XDirect.cond));
1648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (mode64) {
1649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("imm64 r30,0x%llx; ", i->Pin.XDirect.dstGA);
1650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("std r30,");
1651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
1652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("imm32 r30,0x%llx; ", i->Pin.XDirect.dstGA);
1653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("stw r30,");
1654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.XDirect.amCIA);
1656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; ");
1657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (mode64) {
1658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("imm64-fixed5 r30,$disp_cp_chain_me_to_%sEP; ",
1659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    i->Pin.XDirect.toFastEP ? "fast" : "slow");
1660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("imm32-fixed2 r30,$disp_cp_chain_me_to_%sEP; ",
1662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    i->Pin.XDirect.toFastEP ? "fast" : "slow");
1663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("mtctr r30; bctrl }");
1665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
1666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XIndir:
1667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("(xIndir) ");
1668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("if (%s) { ",
1669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 showPPCCondCode(i->Pin.XIndir.cond));
1670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", mode64 ? "std" : "stw");
1671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.XIndir.dstGA);
1672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.XIndir.amCIA);
1674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; ");
1675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("imm%s r30,$disp_cp_xindir; ", mode64 ? "64" : "32");
1676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("mtctr r30; bctr }");
1677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
1678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XAssisted:
1679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("(xAssisted) ");
1680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("if (%s) { ",
1681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 showPPCCondCode(i->Pin.XAssisted.cond));
1682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", mode64 ? "std" : "stw");
1683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.XAssisted.dstGA);
1684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
1685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.XAssisted.amCIA);
1686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; ");
1687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("li r31,$IRJumpKind_to_TRCVAL(%d); ",
1688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 (Int)i->Pin.XAssisted.jk);
1689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("imm%s r30,$disp_cp_xindir; ", mode64 ? "64" : "32");
1690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("mtctr r30; bctr }");
1691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_CMov:
1693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("cmov (%s) ", showPPCCondCode(i->Pin.CMov.cond));
1694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.CMov.dst);
1695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCRI(i->Pin.CMov.src);
1697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(": ");
1698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.CMov.cond.test != Pct_ALWAYS) {
1699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("if (%s) ", showPPCCondCode(i->Pin.CMov.cond));
1700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("{ ");
1702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.CMov.src->tag == Pri_Imm) {
1703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppLoadImm(i->Pin.CMov.dst, i->Pin.CMov.src->Pri.Imm, mode64);
1704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppMovReg(i->Pin.CMov.dst, i->Pin.CMov.src->Pri.Reg);
1706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(" }");
1708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Load: {
1710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool idxd = toBool(i->Pin.Load.src->tag == Pam_RR);
1711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.Load.sz;
1712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      HChar c_sz = sz==1 ? 'b' : sz==2 ? 'h' : sz==4 ? 'w' : 'd';
1713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("l%c%s%s ", c_sz, sz==8 ? "" : "z", idxd ? "x" : "" );
1714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Load.dst);
1715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCAMode(i->Pin.Load.src);
1717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LoadL:
1720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("l%carx ", i->Pin.LoadL.sz==4 ? 'w' : 'd');
1721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.LoadL.dst);
1722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",%%r0,");
1723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.LoadL.src);
1724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Store: {
1726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.Store.sz;
1727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool idxd = toBool(i->Pin.Store.dst->tag == Pam_RR);
1728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      HChar c_sz = sz==1 ? 'b' : sz==2 ? 'h' : sz==4 ? 'w' : /*8*/ 'd';
1729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("st%c%s ", c_sz, idxd ? "x" : "" );
1730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Store.src);
1731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCAMode(i->Pin.Store.dst);
1733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_StoreC:
1736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("st%ccx. ", i->Pin.StoreC.sz==4 ? 'w' : 'd');
1737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.StoreC.src);
1738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",%%r0,");
1739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.StoreC.dst);
1740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Set: {
1742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cc = i->Pin.Set.cond;
1743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("set (%s),", showPPCCondCode(cc));
1744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.Set.dst);
1745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cc.test == Pct_ALWAYS) {
1746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(": { li ");
1747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.Set.dst);
1748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",1 }");
1749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(": { mfcr r0 ; rlwinm ");
1751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.Set.dst);
1752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",r0,%u,31,31", cc.flag+1);
1753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (cc.test == Pct_FALSE) {
1754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vex_printf("; xori ");
1755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ppHRegPPC(i->Pin.Set.dst);
1756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vex_printf(",");
1757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            ppHRegPPC(i->Pin.Set.dst);
1758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vex_printf(",1");
1759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
1760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(" }");
1761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MfCR:
1765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mfcr ");
1766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.MfCR.dst);
1767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
1768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MFence:
1769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mfence (=sync)");
1770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpUnary:
1773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCFpOp(i->Pin.FpUnary.op));
1774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpUnary.dst);
1775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpUnary.src);
1777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpBinary:
1779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCFpOp(i->Pin.FpBinary.op));
1780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpBinary.dst);
1781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpBinary.srcL);
1783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpBinary.srcR);
1785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpMulAcc:
1787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCFpOp(i->Pin.FpMulAcc.op));
1788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpMulAcc.dst);
1789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpMulAcc.srcML);
1791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpMulAcc.srcMR);
1793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpMulAcc.srcAcc);
1795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdSt: {
1797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.FpLdSt.sz;
1798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool idxd = toBool(i->Pin.FpLdSt.addr->tag == Pam_RR);
1799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpLdSt.isLoad) {
1800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("lf%c%s ",
1801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (sz==4 ? 's' : 'd'),
1802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    idxd ? "x" : "" );
1803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.FpLdSt.reg);
1804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",");
1805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppPPCAMode(i->Pin.FpLdSt.addr);
1806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
1807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("stf%c%s ",
1808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    (sz==4 ? 's' : 'd'),
1809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    idxd ? "x" : "" );
1810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.FpLdSt.reg);
1811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(",");
1812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppPPCAMode(i->Pin.FpLdSt.addr);
1813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpSTFIW:
1817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("stfiwz ");
1818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpSTFIW.data);
1819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",0(");
1820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpSTFIW.addr);
1821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(")");
1822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpRSP:
1824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("frsp ");
1825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpRSP.dst);
1826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpRSP.src);
1828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCftI: {
1830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      const HChar* str = "fc?????";
1831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Note that "fcfids" is missing from below. That instruction would
1832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * satisfy the predicate:
1833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       *    (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False)
1834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * which would go into a final "else" clause to make this if-else
1835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * block balanced.  But we're able to implement fcfids by leveraging
1836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       * the fcfid implementation, so it wasn't necessary to include it here.
1837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       */
1838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == False)
1839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True)
1840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fctid";
1841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fctidu";
1843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == True)
1844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True)
1845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fctiw";
1846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fctiwu";
1848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else if (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) {
1849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True) {
1850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            str = "fcfid";
1851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
1852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (i->Pin.FpCftI.flt64 == True)
1853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               str = "fcfidu";
1854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
1855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               str = "fcfidus";
1856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
1857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
1858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", str);
1859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCftI.dst);
1860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCftI.src);
1862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCMov:
1865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("fpcmov (%s) ", showPPCCondCode(i->Pin.FpCMov.cond));
1866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCMov.dst);
1867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCMov.src);
1869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(": ");
1870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("if (fr_dst != fr_src) { ");
1871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCMov.cond.test != Pct_ALWAYS) {
1872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("if (%s) { ", showPPCCondCode(i->Pin.FpCMov.cond));
1873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("fmr ");
1875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCMov.dst);
1876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCMov.src);
1878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCMov.cond.test != Pct_ALWAYS)
1879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(" }");
1880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(" }");
1881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdFPSCR:
1883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mtfsf 0xFF,");
1884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpLdFPSCR.src);
1885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",0, %s", i->Pin.FpLdFPSCR.dfp_rm ? "1" : "0");
1886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCmp:
1888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("fcmpo %%cr1,");
1889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.srcL);
1890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.srcR);
1892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("; mfcr ");
1893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.dst);
1894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("; rlwinm ");
1895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.dst);
1896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.FpCmp.dst);
1898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",8,28,31");
1899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_RdWrLR:
1902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", i->Pin.RdWrLR.wrLR ? "mtlr" : "mflr");
1903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.RdWrLR.gpr);
1904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdSt: {
1907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar  sz = i->Pin.AvLdSt.sz;
1908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      const HChar* str_size;
1909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvLdSt.addr->tag == Pam_IR) {
1910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppLoadImm(hregPPC_GPR30(mode64),
1911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                   i->Pin.AvLdSt.addr->Pam.IR.index, mode64);
1912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(" ; ");
1913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      str_size = sz==1 ? "eb" : sz==2 ? "eh" : sz==4 ? "ew" : "";
1915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvLdSt.isLoad)
1916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("lv%sx ", str_size);
1917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
1918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("stv%sx ", str_size);
1919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvLdSt.reg);
1920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvLdSt.addr->tag == Pam_IR)
1922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("%%r30");
1923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else
1924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegPPC(i->Pin.AvLdSt.addr->Pam.RR.index);
1925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvLdSt.addr->Pam.RR.base);
1927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
1929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUnary:
1930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAvOp(i->Pin.AvUnary.op));
1931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvUnary.dst);
1932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvUnary.src);
1934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBinary:
1936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAvOp(i->Pin.AvBinary.op));
1937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBinary.dst);
1938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBinary.srcL);
1940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBinary.srcR);
1942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin8x16:
1944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s(b) ", showPPCAvOp(i->Pin.AvBin8x16.op));
1945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin8x16.dst);
1946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin8x16.srcL);
1948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin8x16.srcR);
1950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin16x8:
1952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s(h) ", showPPCAvOp(i->Pin.AvBin16x8.op));
1953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin16x8.dst);
1954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin16x8.srcL);
1956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin16x8.srcR);
1958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32x4:
1960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvBin32x4.op));
1961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32x4.dst);
1962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32x4.srcL);
1964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32x4.srcR);
1966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvBin64x2:
1968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvBin64x2.op));
1969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvBin64x2.dst);
1970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
1971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvBin64x2.srcL);
1972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
1973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvBin64x2.srcR);
1974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
1975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32Fx4:
1976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAvFpOp(i->Pin.AvBin32Fx4.op));
1977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32Fx4.dst);
1978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32Fx4.srcL);
1980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvBin32Fx4.srcR);
1982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUn32Fx4:
1984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("%s ", showPPCAvFpOp(i->Pin.AvUn32Fx4.op));
1985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvUn32Fx4.dst);
1986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvUn32Fx4.src);
1988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvPerm:
1990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vperm ");
1991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvPerm.dst);
1992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvPerm.srcL);
1994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvPerm.srcR);
1996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
1997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvPerm.ctl);
1998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
1999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSel:
2001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vsel ");
2002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSel.dst);
2003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
2004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSel.srcL);
2005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
2006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSel.srcR);
2007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
2008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSel.ctl);
2009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvShlDbl:
2012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vsldoi ");
2013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvShlDbl.dst);
2014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
2015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvShlDbl.srcL);
2016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
2017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvShlDbl.srcR);
2018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",%d", i->Pin.AvShlDbl.shift);
2019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSplat: {
2022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.AvSplat.sz;
2023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      HChar ch_sz = toUChar( (sz == 8) ? 'b' : (sz == 16) ? 'h' : 'w' );
2024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vsplt%s%c ",
2025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.AvSplat.src->tag == Pvi_Imm ? "is" : "", ch_sz);
2026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvSplat.dst);
2027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
2028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCVI5s(i->Pin.AvSplat.src);
2029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvSplat.src->tag == Pvi_Reg)
2030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(", %d", (128/sz)-1);   /* louis lane */
2031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvCMov:
2035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("avcmov (%s) ", showPPCCondCode(i->Pin.AvCMov.cond));
2036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvCMov.dst);
2037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
2038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvCMov.src);
2039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(": ");
2040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("if (v_dst != v_src) { ");
2041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvCMov.cond.test != Pct_ALWAYS) {
2042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf("if (%s) { ", showPPCCondCode(i->Pin.AvCMov.cond));
2043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("vmr ");
2045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvCMov.dst);
2046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(",");
2047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvCMov.src);
2048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCMov.cond.test != Pct_ALWAYS)
2049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vex_printf(" }");
2050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf(" }");
2051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdVSCR:
2054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("mtvscr ");
2055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppHRegPPC(i->Pin.AvLdVSCR.src);
2056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvCipherV128Unary:
2059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvCipherV128Unary.op));
2060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvCipherV128Unary.dst);
2061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
2062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvCipherV128Unary.src);
2063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvCipherV128Binary:
2066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvCipherV128Binary.op));
2067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvCipherV128Binary.dst);
2068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
2069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvCipherV128Binary.srcL);
2070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
2071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvCipherV128Binary.srcR);
2072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvHashV128Binary:
2075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvHashV128Binary.op));
2076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvHashV128Binary.dst);
2077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
2078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvHashV128Binary.src);
2079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
2080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppPPCRI(i->Pin.AvHashV128Binary.s_field);
2081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvBCDV128Trinary:
2084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvBCDV128Trinary.op));
2085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvBCDV128Trinary.dst);
2086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
2087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvBCDV128Trinary.src1);
2088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
2089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppHRegPPC(i->Pin.AvBCDV128Trinary.src2);
2090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf(",");
2091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ppPPCRI(i->Pin.AvBCDV128Trinary.ps);
2092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Unary:
2095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.Dfp64Unary.op));
2096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Unary.dst);
2097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Unary.src);
2099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Binary:
2102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.Dfp64Binary.op));
2103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Binary.dst);
2104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Binary.srcL);
2106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Binary.srcR);
2108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift:
2111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpShift.op));
2112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpShift.dst);
2113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpShift.src);
2115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpShift.shift);
2117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Unary:
2120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.Dfp128Unary.op));
2121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Unary.dst_hi);
2122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Unary.src_hi);
2124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Binary:
2127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.Dfp128Binary.op));
2128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Binary.dst_hi);
2129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Binary.srcR_hi);
2131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift128:
2134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpShift128.op));
2135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpShift128.dst_hi);
2136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpShift128.src_hi);
2138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpShift128.shift);
2140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound:
2143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("drintx ");
2144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpRound.dst);
2145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpRound.src);
2147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpRound.r_rmc); /*  R in bit 3 and RMC in bits 2:0 */
2149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound128:
2152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("drintxq ");
2153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpRound128.dst_hi);
2154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpRound128.src_hi);
2156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpRound128.r_rmc); /*  R in bit 3 and RMC in bits 2:0 */
2158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize:
2161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpQuantize.op));
2162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize.dst);
2163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize.srcL);
2165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize.srcR);
2167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpQuantize.rmc);
2169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize128:
2172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /*  Dst is used to pass in left source and return result */
2173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("dquaq ");
2174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize128.dst_hi);
2175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize128.dst_hi);
2177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpQuantize128.src_hi);
2179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCRI(i->Pin.DfpQuantize128.rmc);
2181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpD128toD64:
2184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpD128toD64.op));
2185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpD128toD64.dst);
2186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpD128toD64.src_hi);
2188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpI64StoD128:
2192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("%s ", showPPCFpOp(i->Pin.DfpI64StoD128.op));
2193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpI64StoD128.dst_hi);
2194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.DfpI64StoD128.src);
2196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ExtractExpD128:
2199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("dxexq ");
2200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.ExtractExpD128.dst);
2201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.ExtractExpD128.src_hi);
2203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_InsertExpD128:
2205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("diexq ");
2206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.InsertExpD128.dst_hi);
2207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.InsertExpD128.srcL);
2209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.InsertExpD128.srcR_hi);
2211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Cmp:
2213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("dcmpo %%cr1,");
2214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.srcL);
2215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.srcR);
2217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; mfcr ");
2218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.dst);
2219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; rlwinm ");
2220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.dst);
2221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp64Cmp.dst);
2223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",8,28,31");
2224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Cmp:
2226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("dcmpoq %%cr1,");
2227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.srcL_hi);
2228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.srcR_hi);
2230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; mfcr ");
2231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.dst);
2232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; rlwinm ");
2233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.dst);
2234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",");
2235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppHRegPPC(i->Pin.Dfp128Cmp.dst);
2236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(",8,28,31");
2237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_EvCheck:
2239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Note that the counter dec is 32 bit even in 64-bit mode. */
2240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("(evCheck) ");
2241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("lwz r30,");
2242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.EvCheck.amCounter);
2243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; addic. r30,r30,-1; ");
2244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("stw r30,");
2245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.EvCheck.amCounter);
2246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; bge nofail; lwz r30,");
2247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      ppPPCAMode(i->Pin.EvCheck.amFailAddr);
2248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf("; mtctr r30; bctr; nofail:");
2249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ProfInc:
2251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (mode64) {
2252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("(profInc) imm64-fixed5 r30,$NotKnownYet; ");
2253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("ld r29,(r30); addi r29,r29,1; std r29,(r30)");
2254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
2255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("(profInc) imm32-fixed2 r30,$NotKnownYet; ");
2256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("lwz r29,4(r30); addic. r29,r29,1; stw r29,4(r30)");
2257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("lwz r29,0(r30); addze r29,r29; stw r29,0(r30)");
2258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
2259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
2260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
2261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("\nppPPCInstr: No such tag(%d)\n", (Int)i->tag);
2262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("ppPPCInstr");
2263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Helpers for register allocation. --------- */
2267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid getRegUsage_PPCInstr ( HRegUsage* u, PPCInstr* i, Bool mode64 )
2269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   initHRegUsage(u);
2271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (i->tag) {
2272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LI:
2273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.LI.dst);
2274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
2275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Alu:
2276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Alu.srcL);
2277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCRH(u,    i->Pin.Alu.srcR);
2278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Alu.dst);
2279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Shft:
2281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Shft.srcL);
2282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCRH(u,    i->Pin.Shft.srcR);
2283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Shft.dst);
2284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AddSubC:
2286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AddSubC.dst);
2287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AddSubC.srcL);
2288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AddSubC.srcR);
2289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Cmp:
2291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.Cmp.srcL);
2292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCRH(u,   i->Pin.Cmp.srcR);
2293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Unary:
2295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Unary.dst);
2296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Unary.src);
2297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MulL:
2299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.MulL.dst);
2300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.MulL.srcL);
2301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.MulL.srcR);
2302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Div:
2304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Div.dst);
2305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Div.srcL);
2306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Div.srcR);
2307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Call: {
2309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt argir;
2310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* This is a bit subtle. */
2311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* First off, claim it trashes all the caller-saved regs
2312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         which fall within the register allocator's jurisdiction.
2313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         These I believe to be:
2314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         mode32: r3 to r12
2315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         mode64: r3 to r10
2316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
2317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* XXXXXXXXXXXXXXXXX BUG! This doesn't say anything about the FP
2318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         or Altivec registers.  We get away with this ONLY because
2319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         getAllocatableRegs_PPC gives the allocator callee-saved fp
2320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         and Altivec regs, and no caller-save ones. */
2321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR3(mode64));
2322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR4(mode64));
2323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR5(mode64));
2324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR6(mode64));
2325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR7(mode64));
2326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR8(mode64));
2327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR9(mode64));
2328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR10(mode64));
2329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64) {
2330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, hregPPC_GPR11(mode64));
2331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, hregPPC_GPR12(mode64));
2332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Now we have to state any parameter-carrying registers
2335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         which might be read.  This depends on the argiregs field. */
2336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      argir = i->Pin.Call.argiregs;
2337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir &(1<<10)) addHRegUse(u, HRmRead, hregPPC_GPR10(mode64));
2338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<9)) addHRegUse(u, HRmRead, hregPPC_GPR9(mode64));
2339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<8)) addHRegUse(u, HRmRead, hregPPC_GPR8(mode64));
2340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<7)) addHRegUse(u, HRmRead, hregPPC_GPR7(mode64));
2341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<6)) addHRegUse(u, HRmRead, hregPPC_GPR6(mode64));
2342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<5)) addHRegUse(u, HRmRead, hregPPC_GPR5(mode64));
2343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<4)) addHRegUse(u, HRmRead, hregPPC_GPR4(mode64));
2344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (argir & (1<<3)) addHRegUse(u, HRmRead, hregPPC_GPR3(mode64));
2345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(0 == (argir & ~((1<<3)|(1<<4)|(1<<5)|(1<<6)
2347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                              |(1<<7)|(1<<8)|(1<<9)|(1<<10))));
2348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Finally, there is the issue that the insn trashes a
2350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         register because the literal target address has to be
2351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         loaded into a register.  %r10 seems a suitable victim.
2352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (Can't use %r0, as some insns interpret it as value zero). */
2353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, hregPPC_GPR10(mode64));
2354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Upshot of this is that the assembler really must use %r10,
2355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         and no other, as a destination temporary. */
2356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* XDirect/XIndir/XAssisted are also a bit subtle.  They
2359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      conditionally exit the block.  Hence we only need to list (1)
2360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      the registers that they read, and (2) the registers that they
2361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      write in the case where the block is not exited.  (2) is empty,
2362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      hence only (1) is relevant here. */
2363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XDirect:
2364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.XDirect.amCIA);
2365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XIndir:
2367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.XIndir.dstGA);
2368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.XIndir.amCIA);
2369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XAssisted:
2371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.XAssisted.dstGA);
2372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.XAssisted.amCIA);
2373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_CMov:
2375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCRI(u,  i->Pin.CMov.src);
2376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.CMov.dst);
2377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Load:
2379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCAMode(u, i->Pin.Load.src);
2380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Load.dst);
2381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LoadL:
2383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.LoadL.src);
2384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.LoadL.dst);
2385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Store:
2387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.Store.src);
2388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCAMode(u, i->Pin.Store.dst);
2389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_StoreC:
2391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.StoreC.src);
2392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.StoreC.dst);
2393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Set:
2395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.Set.dst);
2396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MfCR:
2398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.MfCR.dst);
2399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MFence:
2401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpUnary:
2404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpUnary.dst);
2405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpUnary.src);
2406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpBinary:
2408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpBinary.dst);
2409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpBinary.srcL);
2410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpBinary.srcR);
2411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpMulAcc:
2413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpMulAcc.dst);
2414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpMulAcc.srcML);
2415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpMulAcc.srcMR);
2416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpMulAcc.srcAcc);
2417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdSt:
2419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, (i->Pin.FpLdSt.isLoad ? HRmWrite : HRmRead),
2420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.FpLdSt.reg);
2421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCAMode(u, i->Pin.FpLdSt.addr);
2422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpSTFIW:
2424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.FpSTFIW.addr);
2425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.FpSTFIW.data);
2426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpRSP:
2428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpRSP.dst);
2429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpRSP.src);
2430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCftI:
2432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpCftI.dst);
2433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpCftI.src);
2434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCMov:
2436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmModify, i->Pin.FpCMov.dst);
2437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,   i->Pin.FpCMov.src);
2438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdFPSCR:
2440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.FpLdFPSCR.src);
2441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCmp:
2443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.FpCmp.dst);
2444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpCmp.srcL);
2445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.FpCmp.srcR);
2446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_RdWrLR:
2449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, (i->Pin.RdWrLR.wrLR ? HRmRead : HRmWrite),
2450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.RdWrLR.gpr);
2451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdSt:
2454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, (i->Pin.AvLdSt.isLoad ? HRmWrite : HRmRead),
2455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 i->Pin.AvLdSt.reg);
2456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvLdSt.addr->tag == Pam_IR)
2457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64));
2458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCAMode(u, i->Pin.AvLdSt.addr);
2459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUnary:
2461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvUnary.dst);
2462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvUnary.src);
2463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBinary:
2465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvBinary.op == Pav_XOR
2466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          && sameHReg(i->Pin.AvBinary.dst, i->Pin.AvBinary.srcL)
2467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          && sameHReg(i->Pin.AvBinary.dst, i->Pin.AvBinary.srcR)) {
2468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* reg-alloc needs to understand 'xor r,r,r' as a write of r */
2469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* (as opposed to a rite of passage :-) */
2470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, i->Pin.AvBinary.dst);
2471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
2472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, i->Pin.AvBinary.dst);
2473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmRead,  i->Pin.AvBinary.srcL);
2474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmRead,  i->Pin.AvBinary.srcR);
2475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
2476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin8x16:
2478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvBin8x16.dst);
2479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin8x16.srcL);
2480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin8x16.srcR);
2481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin16x8:
2483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvBin16x8.dst);
2484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin16x8.srcL);
2485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin16x8.srcR);
2486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32x4:
2488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvBin32x4.dst);
2489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin32x4.srcL);
2490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin32x4.srcR);
2491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvBin64x2:
2493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmWrite, i->Pin.AvBin64x2.dst);
2494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmRead,  i->Pin.AvBin64x2.srcL);
2495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmRead,  i->Pin.AvBin64x2.srcR);
2496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32Fx4:
2498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvBin32Fx4.dst);
2499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin32Fx4.srcL);
2500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvBin32Fx4.srcR);
2501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvBin32Fx4.op == Pavfp_MULF)
2502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addHRegUse(u, HRmWrite, hregPPC_VR29());
2503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUn32Fx4:
2505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvUn32Fx4.dst);
2506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvUn32Fx4.src);
2507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvPerm:
2509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvPerm.dst);
2510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvPerm.srcL);
2511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvPerm.srcR);
2512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvPerm.ctl);
2513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSel:
2515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvSel.dst);
2516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvSel.ctl);
2517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvSel.srcL);
2518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvSel.srcR);
2519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvShlDbl:
2521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvShlDbl.dst);
2522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvShlDbl.srcL);
2523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,  i->Pin.AvShlDbl.srcR);
2524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSplat:
2526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmWrite, i->Pin.AvSplat.dst);
2527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addRegUsage_PPCVI5s(u,  i->Pin.AvSplat.src);
2528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvCMov:
2530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmModify, i->Pin.AvCMov.dst);
2531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead,   i->Pin.AvCMov.src);
2532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdVSCR:
2534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      addHRegUse(u, HRmRead, i->Pin.AvLdVSCR.src);
2535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvCipherV128Unary:
2537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmWrite, i->Pin.AvCipherV128Unary.dst);
2538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmRead,  i->Pin.AvCipherV128Unary.src);
2539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvCipherV128Binary:
2541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmWrite, i->Pin.AvCipherV128Binary.dst);
2542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmRead,  i->Pin.AvCipherV128Binary.srcL);
2543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmRead,  i->Pin.AvCipherV128Binary.srcR);
2544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvHashV128Binary:
2546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmWrite, i->Pin.AvHashV128Binary.dst);
2547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmRead,  i->Pin.AvHashV128Binary.src);
2548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addRegUsage_PPCRI(u,    i->Pin.AvHashV128Binary.s_field);
2549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvBCDV128Trinary:
2551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmWrite, i->Pin.AvBCDV128Trinary.dst);
2552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmRead,  i->Pin.AvBCDV128Trinary.src1);
2553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addHRegUse(u, HRmRead,  i->Pin.AvBCDV128Trinary.src2);
2554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      addRegUsage_PPCRI(u,    i->Pin.AvBCDV128Trinary.ps);
2555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Unary:
2557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp64Unary.dst);
2558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp64Unary.src);
2559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Binary:
2561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp64Binary.dst);
2562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp64Binary.srcL);
2563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp64Binary.srcR);
2564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift:
2566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCRI(u,    i->Pin.DfpShift.shift);
2567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift.src);
2568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift.dst);
2569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Unary:
2571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Unary.dst_hi);
2572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Unary.dst_lo);
2573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Unary.src_hi);
2574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Unary.src_lo);
2575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Binary:
2577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Binary.dst_hi);
2578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Binary.dst_lo);
2579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp128Binary.srcR_hi);
2580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead, i->Pin.Dfp128Binary.srcR_lo);
2581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound:
2583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpRound.dst);
2584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpRound.src);
2585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound128:
2587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpRound128.dst_hi);
2588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpRound128.dst_lo);
2589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpRound128.src_hi);
2590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpRound128.src_lo);
2591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize:
2593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCRI(u,  i->Pin.DfpQuantize.rmc);
2594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpQuantize.dst);
2595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpQuantize.srcL);
2596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpQuantize.srcR);
2597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize128:
2599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpQuantize128.dst_hi);
2600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpQuantize128.dst_lo);
2601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpQuantize128.src_hi);
2602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.DfpQuantize128.src_lo);
2603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift128:
2605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCRI(u,    i->Pin.DfpShift128.shift);
2606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift128.src_hi);
2607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift128.src_lo);
2608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift128.dst_hi);
2609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpShift128.dst_lo);
2610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpD128toD64:
2612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.src_hi);
2613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.src_lo);
2614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.dst);
2615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpI64StoD128:
2617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.src);
2618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.dst_hi);
2619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.dst_lo);
2620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ExtractExpD128:
2622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.ExtractExpD128.dst);
2623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.ExtractExpD128.src_hi);
2624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.ExtractExpD128.src_lo);
2625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_InsertExpD128:
2627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.InsertExpD128.dst_hi);
2628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.InsertExpD128.dst_lo);
2629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.InsertExpD128.srcL);
2630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.InsertExpD128.srcR_hi);
2631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.InsertExpD128.srcR_lo);
2632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Cmp:
2634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp64Cmp.dst);
2635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp64Cmp.srcL);
2636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp64Cmp.srcR);
2637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Cmp:
2639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, i->Pin.Dfp128Cmp.dst);
2640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Cmp.srcL_hi);
2641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Cmp.srcL_lo);
2642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Cmp.srcR_hi);
2643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmRead,  i->Pin.Dfp128Cmp.srcR_lo);
2644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_EvCheck:
2646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We expect both amodes only to mention the GSP (r31), so this
2647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         is in fact pointless, since GSP isn't allocatable, but
2648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         anyway.. */
2649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.EvCheck.amCounter);
2650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addRegUsage_PPCAMode(u, i->Pin.EvCheck.amFailAddr);
2651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64)); /* also unavail to RA */
2652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ProfInc:
2654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, hregPPC_GPR29(mode64));
2655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64));
2656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
2658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCInstr(i, mode64);
2659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("getRegUsage_PPCInstr");
2660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* local helper */
2664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapReg( HRegRemap* m, HReg* r )
2665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *r = lookupHRegRemap(m, *r);
2667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid mapRegs_PPCInstr ( HRegRemap* m, PPCInstr* i, Bool mode64 )
2670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (i->tag) {
2672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LI:
2673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.LI.dst);
2674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Alu:
2676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Alu.dst);
2677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Alu.srcL);
2678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCRH(m, i->Pin.Alu.srcR);
2679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Shft:
2681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Shft.dst);
2682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Shft.srcL);
2683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCRH(m, i->Pin.Shft.srcR);
2684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AddSubC:
2686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AddSubC.dst);
2687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AddSubC.srcL);
2688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AddSubC.srcR);
2689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Cmp:
2691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Cmp.srcL);
2692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCRH(m, i->Pin.Cmp.srcR);
2693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Unary:
2695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Unary.dst);
2696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Unary.src);
2697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MulL:
2699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.MulL.dst);
2700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.MulL.srcL);
2701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.MulL.srcR);
2702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Div:
2704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Div.dst);
2705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Div.srcL);
2706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Div.srcR);
2707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Call:
2709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XDirect:
2711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.XDirect.amCIA);
2712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XIndir:
2714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.XIndir.dstGA);
2715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.XIndir.amCIA);
2716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XAssisted:
2718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.XAssisted.dstGA);
2719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.XAssisted.amCIA);
2720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_CMov:
2722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCRI(m, i->Pin.CMov.src);
2723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.CMov.dst);
2724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Load:
2726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCAMode(m, i->Pin.Load.src);
2727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Load.dst);
2728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LoadL:
2730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.LoadL.src);
2731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.LoadL.dst);
2732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Store:
2734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Store.src);
2735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCAMode(m, i->Pin.Store.dst);
2736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_StoreC:
2738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.StoreC.src);
2739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.StoreC.dst);
2740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Set:
2742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.Set.dst);
2743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MfCR:
2745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.MfCR.dst);
2746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MFence:
2748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpUnary:
2750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpUnary.dst);
2751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpUnary.src);
2752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpBinary:
2754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpBinary.dst);
2755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpBinary.srcL);
2756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpBinary.srcR);
2757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpMulAcc:
2759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpMulAcc.dst);
2760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpMulAcc.srcML);
2761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpMulAcc.srcMR);
2762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpMulAcc.srcAcc);
2763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdSt:
2765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpLdSt.reg);
2766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCAMode(m, i->Pin.FpLdSt.addr);
2767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpSTFIW:
2769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpSTFIW.addr);
2770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpSTFIW.data);
2771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpRSP:
2773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpRSP.dst);
2774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpRSP.src);
2775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCftI:
2777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCftI.dst);
2778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCftI.src);
2779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCMov:
2781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCMov.dst);
2782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCMov.src);
2783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdFPSCR:
2785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpLdFPSCR.src);
2786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCmp:
2788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCmp.dst);
2789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCmp.srcL);
2790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.FpCmp.srcR);
2791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_RdWrLR:
2793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.RdWrLR.gpr);
2794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdSt:
2796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvLdSt.reg);
2797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCAMode(m, i->Pin.AvLdSt.addr);
2798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUnary:
2800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvUnary.dst);
2801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvUnary.src);
2802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBinary:
2804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBinary.dst);
2805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBinary.srcL);
2806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBinary.srcR);
2807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin8x16:
2809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin8x16.dst);
2810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin8x16.srcL);
2811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin8x16.srcR);
2812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin16x8:
2814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin16x8.dst);
2815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin16x8.srcL);
2816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin16x8.srcR);
2817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32x4:
2819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32x4.dst);
2820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32x4.srcL);
2821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32x4.srcR);
2822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvBin64x2:
2824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvBin64x2.dst);
2825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvBin64x2.srcL);
2826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvBin64x2.srcR);
2827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32Fx4:
2829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32Fx4.dst);
2830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32Fx4.srcL);
2831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvBin32Fx4.srcR);
2832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUn32Fx4:
2834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvUn32Fx4.dst);
2835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvUn32Fx4.src);
2836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvPerm:
2838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvPerm.dst);
2839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvPerm.srcL);
2840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvPerm.srcR);
2841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvPerm.ctl);
2842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSel:
2844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSel.dst);
2845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSel.srcL);
2846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSel.srcR);
2847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSel.ctl);
2848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvShlDbl:
2850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvShlDbl.dst);
2851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvShlDbl.srcL);
2852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvShlDbl.srcR);
2853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSplat:
2855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvSplat.dst);
2856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapRegs_PPCVI5s(m, i->Pin.AvSplat.src);
2857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvCMov:
2859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     mapReg(m, &i->Pin.AvCMov.dst);
2860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     mapReg(m, &i->Pin.AvCMov.src);
2861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     return;
2862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdVSCR:
2863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      mapReg(m, &i->Pin.AvLdVSCR.src);
2864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return;
2865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvCipherV128Unary:
2866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvCipherV128Unary.dst);
2867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvCipherV128Unary.src);
2868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvCipherV128Binary:
2870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvCipherV128Binary.dst);
2871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvCipherV128Binary.srcL);
2872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvCipherV128Binary.srcR);
2873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvHashV128Binary:
2875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapRegs_PPCRI(m, i->Pin.AvHashV128Binary.s_field);
2876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvHashV128Binary.dst);
2877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvHashV128Binary.src);
2878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvBCDV128Trinary:
2880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvBCDV128Trinary.dst);
2881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvBCDV128Trinary.src1);
2882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapReg(m, &i->Pin.AvBCDV128Trinary.src2);
2883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mapRegs_PPCRI(m, i->Pin.AvBCDV128Trinary.ps);
2884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return;
2885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Unary:
2886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Unary.dst);
2887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Unary.src);
2888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Binary:
2890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Binary.dst);
2891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Binary.srcL);
2892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Binary.srcR);
2893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift:
2895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCRI(m, i->Pin.DfpShift.shift);
2896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift.src);
2897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift.dst);
2898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Unary:
2900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Unary.dst_hi);
2901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Unary.dst_lo);
2902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Unary.src_hi);
2903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Unary.src_lo);
2904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     return;
2905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Binary:
2906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Binary.dst_hi);
2907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Binary.dst_lo);
2908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Binary.srcR_hi);
2909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Binary.srcR_lo);
2910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift128:
2912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCRI(m, i->Pin.DfpShift128.shift);
2913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift128.src_hi);
2914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift128.src_lo);
2915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift128.dst_hi);
2916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpShift128.dst_lo);
2917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound:
2919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound.dst);
2920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound.src);
2921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound128:
2923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound128.dst_hi);
2924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound128.dst_lo);
2925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound128.src_hi);
2926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpRound128.src_lo);
2927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize:
2929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCRI(m, i->Pin.DfpQuantize.rmc);
2930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize.dst);
2931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize.srcL);
2932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize.srcR);
2933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize128:
2935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCRI(m, i->Pin.DfpQuantize128.rmc);
2936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize128.dst_hi);
2937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize128.dst_lo);
2938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize128.src_hi);
2939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpQuantize128.src_lo);
2940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpD128toD64:
2942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpD128toD64.src_hi);
2943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpD128toD64.src_lo);
2944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpD128toD64.dst);
2945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpI64StoD128:
2947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpI64StoD128.src);
2948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpI64StoD128.dst_hi);
2949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.DfpI64StoD128.dst_lo);
2950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ExtractExpD128:
2952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.ExtractExpD128.dst);
2953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.ExtractExpD128.src_hi);
2954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.ExtractExpD128.src_lo);
2955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_InsertExpD128:
2957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.dst_hi);
2958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.dst_lo);
2959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.srcL);
2960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.srcR_hi);
2961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.InsertExpD128.srcR_lo);
2962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Cmp:
2964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Cmp.dst);
2965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Cmp.srcL);
2966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp64Cmp.srcR);
2967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Cmp:
2969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.dst);
2970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.srcL_hi);
2971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.srcL_lo);
2972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.srcR_hi);
2973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapReg(m, &i->Pin.Dfp128Cmp.srcR_lo);
2974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_EvCheck:
2976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We expect both amodes only to mention the GSP (r31), so this
2977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         is in fact pointless, since GSP isn't allocatable, but
2978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         anyway.. */
2979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.EvCheck.amCounter);
2980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mapRegs_PPCAMode(m, i->Pin.EvCheck.amFailAddr);
2981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ProfInc:
2983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* hardwires r29 and r30 -- nothing to modify. */
2984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return;
2985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
2986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ppPPCInstr(i, mode64);
2987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vpanic("mapRegs_PPCInstr");
2988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
2989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
2990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Figure out if i represents a reg-reg move, and if so assign the
2992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   source and destination to *src and *dst.  If in doubt say No.  Used
2993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   by the register allocator to do move coalescing.
2994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
2995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool isMove_PPCInstr ( PPCInstr* i, HReg* src, HReg* dst )
2996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
2997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Moves between integer regs */
2998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (i->tag == Pin_Alu) {
2999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // or Rd,Rs,Rs == mr Rd,Rs
3000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Alu.op != Palu_OR)
3001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return False;
3002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.Alu.srcR->tag != Prh_Reg)
3003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return False;
3004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (! sameHReg(i->Pin.Alu.srcR->Prh.Reg.reg, i->Pin.Alu.srcL))
3005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return False;
3006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *src = i->Pin.Alu.srcL;
3007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *dst = i->Pin.Alu.dst;
3008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
3009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Moves between FP regs */
3011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (i->tag == Pin_FpUnary) {
3012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpUnary.op != Pfp_MOV)
3013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return False;
3014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *src = i->Pin.FpUnary.src;
3015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      *dst = i->Pin.FpUnary.dst;
3016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return True;
3017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return False;
3019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Generate ppc spill/reload instructions under the direction of the
3023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register allocator.  Note it's critical these don't write the
3024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   condition codes. */
3025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid genSpill_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
3027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    HReg rreg, Int offsetB, Bool mode64 )
3028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAMode* am;
3030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(rreg));
3031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *i1 = *i2 = NULL;
3032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am = PPCAMode_IR( offsetB, GuestStatePtr(mode64) );
3033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (hregClass(rreg)) {
3034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcInt64:
3035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
3036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_Store( 8, am, rreg, mode64 );
3037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
3038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcInt32:
3039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(!mode64);
3040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_Store( 4, am, rreg, mode64 );
3041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
3042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcFlt64:
3043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_FpLdSt ( False/*store*/, 8, rreg, am );
3044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
3045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcVec128:
3046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // XXX: GPR30 used as spill register to kludge AltiVec
3047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // AMode_IR
3048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_AvLdSt ( False/*store*/, 16, rreg, am );
3049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
3050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
3051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegClass(hregClass(rreg));
3052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("genSpill_PPC: unimplemented regclass");
3053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
3057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     HReg rreg, Int offsetB, Bool mode64 )
3058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   PPCAMode* am;
3060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(rreg));
3061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *i1 = *i2 = NULL;
3062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   am = PPCAMode_IR( offsetB, GuestStatePtr(mode64) );
3063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (hregClass(rreg)) {
3064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcInt64:
3065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
3066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_Load( 8, rreg, am, mode64 );
3067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
3068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcInt32:
3069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(!mode64);
3070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_Load( 4, rreg, am, mode64 );
3071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
3072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcFlt64:
3073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_FpLdSt ( True/*load*/, 8, rreg, am );
3074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
3075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case HRcVec128:
3076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // XXX: GPR30 used as spill register to kludge AltiVec AMode_IR
3077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         *i1 = PPCInstr_AvLdSt ( True/*load*/, 16, rreg, am );
3078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         return;
3079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
3080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppHRegClass(hregClass(rreg));
3081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vpanic("genReload_PPC: unimplemented regclass");
3082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- The ppc assembler (bleh.) --------- */
3087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt iregNo ( HReg r, Bool mode64 )
3089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt n;
3091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(hregClass(r) == mode64 ? HRcInt64 : HRcInt32);
3092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(r));
3093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   n = hregNumber(r);
3094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(n <= 32);
3095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return n;
3096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt fregNo ( HReg fr )
3099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt n;
3101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(hregClass(fr) == HRcFlt64);
3102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(fr));
3103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   n = hregNumber(fr);
3104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(n <= 32);
3105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return n;
3106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt vregNo ( HReg v )
3109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt n;
3111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(hregClass(v) == HRcVec128);
3112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(!hregIsVirtual(v));
3113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   n = hregNumber(v);
3114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(n <= 32);
3115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return n;
3116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Emit an instruction big-endianly */
3119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* emit32 ( UChar* p, UInt w32 )
3120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *p++ = toUChar((w32 >> 24) & 0x000000FF);
3122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *p++ = toUChar((w32 >> 16) & 0x000000FF);
3123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *p++ = toUChar((w32 >>  8) & 0x000000FF);
3124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   *p++ = toUChar((w32)       & 0x000000FF);
3125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
3126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Fetch an instruction big-endianly */
3129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt fetch32 ( UChar* p )
3130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt w32 = 0;
3132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w32 |= ((0xFF & (UInt)p[0]) << 24);
3133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w32 |= ((0xFF & (UInt)p[1]) << 16);
3134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w32 |= ((0xFF & (UInt)p[2]) <<  8);
3135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w32 |= ((0xFF & (UInt)p[3]) <<  0);
3136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return w32;
3137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The following mkForm[...] functions refer to ppc instruction forms
3140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   as per PPC32 p576
3141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
3142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormD ( UChar* p, UInt opc1,
3144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt r1, UInt r2, UInt imm )
3145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   imm = imm & 0xFFFF;
3151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (imm));
3152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormMD ( UChar* p, UInt opc1, UInt r1, UInt r2,
3156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt imm1, UInt imm2, UInt opc2 )
3157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(imm1 < 0x40);
3163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(imm2 < 0x40);
3164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x08);
3165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   imm2 = ((imm2 & 0x1F) << 1) | (imm2 >> 5);
3166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               ((imm1 & 0x1F)<<11) | (imm2<<5) |
3168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (opc2<<2) | ((imm1 >> 5)<<1));
3169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormX ( UChar* p, UInt opc1, UInt r1, UInt r2,
3173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt r3, UInt opc2, UInt b0 )
3174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2);
3182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r3<<11) | (opc2<<1) | (b0));
3184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXO ( UChar* p, UInt opc1, UInt r1, UInt r2,
3188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt r3, UInt b10, UInt opc2, UInt b0 )
3189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b10  < 0x2);
3196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x200);
3197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2);
3198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r3<<11) | (b10 << 10) | (opc2<<1) | (b0));
3200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXL ( UChar* p, UInt opc1, UInt f1, UInt f2,
3204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt f3, UInt opc2, UInt b0 )
3205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f1   < 0x20);
3209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f2   < 0x20);
3210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f3   < 0x20);
3211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2);
3213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (f1<<21) | (f2<<16) |
3214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (f3<<11) | (opc2<<1) | (b0));
3215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Note: for split field ops, give mnemonic arg
3219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXFX ( UChar* p, UInt r1, UInt f2, UInt opc2 )
3220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f2   < 0x20);
3224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (opc2) {
3226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 144:  // mtcrf
3227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(f2 < 0x100);
3228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      f2 = f2 << 1;
3229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 339:  // mfspr
3231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 371:  // mftb
3232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case 467:  // mtspr
3233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(f2 < 0x400);
3234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // re-arrange split field
3235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      f2 = ((f2>>5) & 0x1F) | ((f2 & 0x1F)<<5);
3236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      break;
3237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default: vpanic("mkFormXFX(ppch)");
3238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((31<<26) | (r1<<21) | (f2<<11) | (opc2<<1));
3240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Only used by mtfsf
3244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormXFL ( UChar* p, UInt FM, UInt freg, UInt dfp_rm )
3245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(FM   < 0x100);
3248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(freg < 0x20);
3249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   theInstr = ((63<<26) | (FM<<17) | (dfp_rm<<16) | (freg<<11) | (711<<1));
3250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXS ( UChar* p, UInt opc1, UInt r1, UInt r2,
3254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt imm, UInt opc2, UInt b0 )
3255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(imm  < 0x40);
3261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2);
3263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               ((imm & 0x1F)<<11) | (opc2<<2) | ((imm>>5)<<1) | (b0));
3265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
3270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'b'
3271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormI ( UChar* p, UInt LI, UInt AA, UInt LK )
3272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(LI  < 0x1000000);
3275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(AA  < 0x2);
3276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(LK  < 0x2);
3277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((18<<26) | (LI<<2) | (AA<<1) | (LK));
3278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
3281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'bc'
3283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormB ( UChar* p, UInt BO, UInt BI,
3284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt BD, UInt AA, UInt LK )
3285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(BO  < 0x20);
3288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(BI  < 0x20);
3289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(BD  < 0x4000);
3290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(AA  < 0x2);
3291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(LK  < 0x2);
3292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((16<<26) | (BO<<21) | (BI<<16) |
3293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (BD<<2) | (AA<<1) | (LK));
3294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// rotates
3298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormM ( UChar* p, UInt opc1, UInt r1, UInt r2,
3299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt f3, UInt MB, UInt ME, UInt Rc )
3300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(f3   < 0x20);
3306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(MB   < 0x20);
3307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(ME   < 0x20);
3308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(Rc   < 0x2);
3309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (f3<<11) | (MB<<6) | (ME<<1) | (Rc));
3311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormA ( UChar* p, UInt opc1, UInt r1, UInt r2,
3315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        UInt r3, UInt r4, UInt opc2, UInt b0 )
3316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r4   < 0x20);
3323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x20);
3324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(b0   < 0x2 );
3325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (r3<<11) |
3326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r4<<6) | (opc2<<1) | (b0));
3327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormZ22 ( UChar* p, UInt opc1, UInt r1, UInt r2,
3331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                          UInt constant, UInt opc2, UInt b0 )
3332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt theInstr;
3334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(opc1     < 0x40);
3335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r1       < 0x20);
3336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r2       < 0x20);
3337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(constant < 0x40);   /* 6 bit constant */
3338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(opc2     < 0x200);  /* 9 bit field */
3339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(b0       < 0x2);
3340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               (constant<<10) | (opc2<<1) | (b0));
3342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return emit32(p, theInstr);
3343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormZ23 ( UChar* p, UInt opc1, UInt r1, UInt r2,
3346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                          UInt r3, UInt rmc, UInt opc2, UInt b0 )
3347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt theInstr;
3349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(opc1 < 0x40);
3350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r1   < 0x20);
3351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r2   < 0x20);
3352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r3   < 0x20);
3353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(rmc  < 0x4);
3354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(opc2 < 0x100);
3355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(b0   < 0x2);
3356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               (r3<<11) | (rmc<<9) | (opc2<<1) | (b0));
3358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return emit32(p, theInstr);
3359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* doAMode_IR ( UChar* p, UInt opc1, UInt rSD,
3362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           PPCAMode* am, Bool mode64 )
3363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt rA, idx;
3365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(am->tag == Pam_IR);
3366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(am->Pam.IR.index < 0x10000);
3367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rA  = iregNo(am->Pam.IR.base, mode64);
3369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   idx = am->Pam.IR.index;
3370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (opc1 == 58 || opc1 == 62) { // ld/std: mode64 only
3372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(mode64);
3373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* stay sane with DS form: lowest 2 bits must be 00.  This
3374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         should be guaranteed to us by iselWordExpr_AMode. */
3375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(0 == (idx & 3));
3376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p = mkFormD(p, opc1, rSD, rA, idx);
3378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
3379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* doAMode_RR ( UChar* p, UInt opc1, UInt opc2,
3382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           UInt rSD, PPCAMode* am, Bool mode64 )
3383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt rA, rB;
3385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(am->tag == Pam_RR);
3386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rA  = iregNo(am->Pam.RR.base, mode64);
3388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rB  = iregNo(am->Pam.RR.index, mode64);
3389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   p = mkFormX(p, opc1, rSD, rA, rB, opc2, 0);
3391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
3392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Load imm to r_dst */
3396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkLoadImm ( UChar* p, UInt r_dst, ULong imm, Bool mode64 )
3397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r_dst < 0x20);
3399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!mode64) {
3401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* In 32-bit mode, make sure the top 32 bits of imm are a sign
3402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         extension of the bottom 32 bits, so that the range tests
3403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         below work correctly. */
3404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt u32 = (UInt)imm;
3405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int  s32 = (Int)u32;
3406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Long s64 = (Long)s32;
3407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      imm = (ULong)s64;
3408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (imm >= 0xFFFFFFFFFFFF8000ULL || imm < 0x8000) {
3411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // sign-extendable from 16 bits
3412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // addi r_dst,0,imm  => li r_dst,imm
3414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormD(p, 14, r_dst, 0, imm & 0xFFFF);
3415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
3416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (imm >= 0xFFFFFFFF80000000ULL || imm < 0x80000000ULL) {
3417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // sign-extendable from 32 bits
3418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16)
3420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF);
3421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // ori r_dst, r_dst, (imm & 0xFFFF)
3422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
3424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // full 64bit immediate load: 5 (five!) insns.
3425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
3426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load high word
3428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // lis r_dst, (imm>>48) & 0xFFFF
3430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF);
3431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // ori r_dst, r_dst, (imm>>32) & 0xFFFF
3433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if ((imm>>32) & 0xFFFF)
3434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF);
3435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // shift r_dst low word to high word => rldicr
3437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1);
3438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // load low word
3440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // oris r_dst, r_dst, (imm>>16) & 0xFFFF
3442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if ((imm>>16) & 0xFFFF)
3443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF);
3444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // ori r_dst, r_dst, (imm) & 0xFFFF
3446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (imm & 0xFFFF)
3447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
3451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A simplified version of mkLoadImm that always generates 2 or 5
3454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   instructions (32 or 64 bits respectively) even if it could generate
3455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   fewer.  This is needed for generating fixed sized patchable
3456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   sequences. */
3457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkLoadImm_EXACTLY2or5 ( UChar* p,
3458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      UInt r_dst, ULong imm, Bool mode64 )
3459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r_dst < 0x20);
3461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!mode64) {
3463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* In 32-bit mode, make sure the top 32 bits of imm are a sign
3464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         extension of the bottom 32 bits.  (Probably unnecessary.) */
3465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt u32 = (UInt)imm;
3466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Int  s32 = (Int)u32;
3467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Long s64 = (Long)s32;
3468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      imm = (ULong)s64;
3469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!mode64) {
3472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16)
3473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF);
3474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm & 0xFFFF)
3475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
3478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // full 64bit immediate load: 5 (five!) insns.
3479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // load high word
3481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // lis r_dst, (imm>>48) & 0xFFFF
3482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF);
3483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm>>32) & 0xFFFF
3485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF);
3486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // shift r_dst low word to high word => rldicr
3488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1);
3489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // load low word
3491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // oris r_dst, r_dst, (imm>>16) & 0xFFFF
3492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF);
3493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm) & 0xFFFF
3495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return p;
3498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Checks whether the sequence of bytes at p was indeed created
3501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   by mkLoadImm_EXACTLY2or5 with the given parameters. */
3502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool isLoadImm_EXACTLY2or5 ( UChar* p_to_check,
3503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    UInt r_dst, ULong imm, Bool mode64 )
3504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(r_dst < 0x20);
3506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!mode64) {
3508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* In 32-bit mode, make sure the top 32 bits of imm are a sign
3509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         extension of the bottom 32 bits.  (Probably unnecessary.) */
3510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt u32 = (UInt)imm;
3511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Int  s32 = (Int)u32;
3512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Long s64 = (Long)s32;
3513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      imm = (ULong)s64;
3514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (!mode64) {
3517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt   expect[2] = { 0, 0 };
3518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* p         = (UChar*)&expect[0];
3519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16)
3520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF);
3521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm & 0xFFFF)
3522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(p == (UChar*)&expect[2]);
3524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return fetch32(p_to_check + 0) == expect[0]
3526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 4) == expect[1];
3527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
3529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt   expect[5] = { 0, 0, 0, 0, 0 };
3530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* p         = (UChar*)&expect[0];
3531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // full 64bit immediate load: 5 (five!) insns.
3532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // load high word
3534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // lis r_dst, (imm>>48) & 0xFFFF
3535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF);
3536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm>>32) & 0xFFFF
3538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF);
3539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // shift r_dst low word to high word => rldicr
3541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1);
3542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // load low word
3544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // oris r_dst, r_dst, (imm>>16) & 0xFFFF
3545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF);
3546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // ori r_dst, r_dst, (imm) & 0xFFFF
3548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF);
3549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(p == (UChar*)&expect[5]);
3551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return fetch32(p_to_check + 0) == expect[0]
3553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 4) == expect[1]
3554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 8) == expect[2]
3555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 12) == expect[3]
3556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             && fetch32(p_to_check + 16) == expect[4];
3557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a machine-word sized load or store.  Simplified version of
3562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   the Pin_Load and Pin_Store cases below. */
3563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* do_load_or_store_machine_word (
3564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UChar* p, Bool isLoad,
3565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UInt reg, PPCAMode* am, Bool mode64 )
3566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (isLoad) {
3568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt opc1, sz = mode64 ? 8 : 4;
3569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (am->tag) {
3570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_IR:
3571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (mode64) {
3572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               vassert(0 == (am->Pam.IR.index & 3));
3573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            switch (sz) {
3575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 4:  opc1 = 32; vassert(!mode64); break;
3576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 8:  opc1 = 58; vassert(mode64);  break;
3577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default: vassert(0);
3578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            p = doAMode_IR(p, opc1, reg, am, mode64);
3580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
3581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_RR:
3582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* we could handle this case, but we don't expect to ever
3583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               need to. */
3584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
3586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
3588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else /*store*/ {
3589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt opc1, sz = mode64 ? 8 : 4;
3590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (am->tag) {
3591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_IR:
3592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (mode64) {
3593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               vassert(0 == (am->Pam.IR.index & 3));
3594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            switch (sz) {
3596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 4:  opc1 = 36; vassert(!mode64); break;
3597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 8:  opc1 = 62; vassert(mode64);  break;
3598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default: vassert(0);
3599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            p = doAMode_IR(p, opc1, reg, am, mode64);
3601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
3602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_RR:
3603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* we could handle this case, but we don't expect to ever
3604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               need to. */
3605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
3607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
3609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return p;
3611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a 32-bit sized load or store.  Simplified version of
3614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   do_load_or_store_machine_word above. */
3615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* do_load_or_store_word32 (
3616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UChar* p, Bool isLoad,
3617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UInt reg, PPCAMode* am, Bool mode64 )
3618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
3619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (isLoad) {
3620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt opc1;
3621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (am->tag) {
3622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_IR:
3623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (mode64) {
3624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               vassert(0 == (am->Pam.IR.index & 3));
3625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            opc1 = 32;
3627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            p = doAMode_IR(p, opc1, reg, am, mode64);
3628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
3629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_RR:
3630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* we could handle this case, but we don't expect to ever
3631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               need to. */
3632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
3634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
3636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else /*store*/ {
3637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt opc1;
3638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (am->tag) {
3639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_IR:
3640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (mode64) {
3641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               vassert(0 == (am->Pam.IR.index & 3));
3642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
3643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            opc1 = 36;
3644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            p = doAMode_IR(p, opc1, reg, am, mode64);
3645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
3646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Pam_RR:
3647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* we could handle this case, but we don't expect to ever
3648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               need to. */
3649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
3651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vassert(0);
3652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
3653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
3654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return p;
3655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
3656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Move r_dst to r_src */
3658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkMoveReg ( UChar* p, UInt r_dst, UInt r_src )
3659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r_dst < 0x20);
3661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r_src < 0x20);
3662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (r_dst != r_src) {
3664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* or r_dst, r_src, r_src */
3665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, r_src, r_dst, r_src, 444, 0 );
3666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p;
3668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVX ( UChar* p, UInt opc1, UInt r1, UInt r2,
3671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt r3, UInt opc2 )
3672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x800);
3679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (r3<<11) | opc2);
3680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVXR ( UChar* p, UInt opc1, UInt r1, UInt r2,
3684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          UInt r3, UInt Rc, UInt opc2 )
3685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(Rc   < 0x2);
3692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x400);
3693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r3<<11) | (Rc<<10) | opc2);
3695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVA ( UChar* p, UInt opc1, UInt r1, UInt r2,
3699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         UInt r3, UInt r4, UInt opc2 )
3700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt theInstr;
3702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc1 < 0x40);
3703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r1   < 0x20);
3704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r2   < 0x20);
3705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r3   < 0x20);
3706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(r4   < 0x20);
3707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(opc2 < 0x40);
3708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) |
3709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               (r3<<11) | (r4<<6) | opc2);
3710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return emit32(p, theInstr);
3711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
3712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Emit an instruction into buf and return the number of bytes used.
3716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Note that buf is not the insn's final place, and therefore it is
3717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   imperative to emit position-independent code.  If the emitted
3718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   instruction was a profiler inc, set *is_profInc to True, else leave
3719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   it unchanged.
3720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
3721663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt emit_PPCInstr ( /*MB_MOD*/Bool* is_profInc,
3722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    UChar* buf, Int nbuf, PPCInstr* i,
3723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    Bool mode64,
3724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    void* disp_cp_chain_me_to_slowEP,
3725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    void* disp_cp_chain_me_to_fastEP,
3726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    void* disp_cp_xindir,
3727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    void* disp_cp_xassisted )
3728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
3729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UChar* p = &buf[0];
3730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vassert(nbuf >= 32);
3731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (0) {
3733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vex_printf("asm  ");ppPPCInstr(i, mode64); vex_printf("\n");
3734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   switch (i->tag) {
3737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LI:
3739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkLoadImm(p, iregNo(i->Pin.LI.dst, mode64),
3740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    i->Pin.LI.imm64, mode64);
3741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Alu: {
3744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* srcR   = i->Pin.Alu.srcR;
3745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool   immR   = toBool(srcR->tag == Prh_Imm);
3746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_dst  = iregNo(i->Pin.Alu.dst, mode64);
3747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_srcL = iregNo(i->Pin.Alu.srcL, mode64);
3748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_srcR = immR ? (-1)/*bogus*/ :
3749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             iregNo(srcR->Prh.Reg.reg, mode64);
3750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.Alu.op) {
3752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_ADD:
3753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* addi (PPC32 p350) */
3755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(srcR->Prh.Imm.syned);
3756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(srcR->Prh.Imm.imm16 != 0x8000);
3757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 14, r_dst, r_srcL, srcR->Prh.Imm.imm16);
3758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* add (PPC32 p347) */
3760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 266, 0);
3761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_SUB:
3765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* addi (PPC32 p350), but with negated imm */
3767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(srcR->Prh.Imm.syned);
3768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(srcR->Prh.Imm.imm16 != 0x8000);
3769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 14, r_dst, r_srcL, (- srcR->Prh.Imm.imm16));
3770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* subf (PPC32 p537), with args the "wrong" way round */
3772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 40, 0);
3773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_AND:
3777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* andi. (PPC32 p358) */
3779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(!srcR->Prh.Imm.syned);
3780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 28, r_srcL, r_dst, srcR->Prh.Imm.imm16);
3781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* and (PPC32 p356) */
3783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 28, 0);
3784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_OR:
3788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* ori (PPC32 p497) */
3790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(!srcR->Prh.Imm.syned);
3791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 24, r_srcL, r_dst, srcR->Prh.Imm.imm16);
3792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* or (PPC32 p495) */
3794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 444, 0);
3795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Palu_XOR:
3799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (immR) {
3800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* xori (PPC32 p550) */
3801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(!srcR->Prh.Imm.syned);
3802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 26, r_srcL, r_dst, srcR->Prh.Imm.imm16);
3803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* xor (PPC32 p549) */
3805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 316, 0);
3806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
3810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
3811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Shft: {
3816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* srcR   = i->Pin.Shft.srcR;
3817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool   sz32   = i->Pin.Shft.sz32;
3818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool   immR   = toBool(srcR->tag == Prh_Imm);
3819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_dst  = iregNo(i->Pin.Shft.dst, mode64);
3820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_srcL = iregNo(i->Pin.Shft.srcL, mode64);
3821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt   r_srcR = immR ? (-1)/*bogus*/ :
3822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             iregNo(srcR->Prh.Reg.reg, mode64);
3823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64)
3824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(sz32);
3825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.Shft.op) {
3827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pshft_SHL:
3828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32) {
3829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* rd = rs << n, 1 <= n <= 31
3831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  is
3832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  rlwinm rd,rs,n,0,31-n  (PPC32 p501)
3833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               */
3834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 32);
3837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormM(p, 21, r_srcL, r_dst, n, 0, 31-n, 0);
3838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* slw (PPC32 p505) */
3840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 24, 0);
3841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* rd = rs << n, 1 <= n <= 63
3845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  is
3846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  rldicr rd,rs,n,63-n  (PPC64 p559)
3847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               */
3848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 64);
3851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormMD(p, 30, r_srcL, r_dst, n, 63-n, 1);
3852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* sld (PPC64 p568) */
3854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 27, 0);
3855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pshft_SHR:
3860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32) {
3861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             if (immR) {
3862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* rd = rs >>u n, 1 <= n <= 31
3863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  is
3864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  rlwinm rd,rs,32-n,n,31  (PPC32 p501)
3865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               */
3866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 32);
3869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormM(p, 21, r_srcL, r_dst, 32-n, n, 31, 0);
3870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* srw (PPC32 p508) */
3872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 536, 0);
3873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* rd = rs >>u n, 1 <= n <= 63
3877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  is
3878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  rldicl rd,rs,64-n,n  (PPC64 p558)
3879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               */
3880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 64);
3883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormMD(p, 30, r_srcL, r_dst, 64-n, n, 0);
3884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* srd (PPC64 p574) */
3886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 539, 0);
3887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pshft_SAR:
3892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32) {
3893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* srawi (PPC32 p507) */
3895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* In 64-bit mode, we allow right shifts by zero bits
3898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  as that is a handy way to sign extend the lower 32
3899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  bits into the upper 32 bits. */
3900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               if (mode64)
3901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  vassert(n >= 0 && n < 32);
3902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               else
3903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  vassert(n > 0 && n < 32);
3904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, n, 824, 0);
3905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* sraw (PPC32 p506) */
3907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 792, 0);
3908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
3910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (immR) {
3911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* sradi (PPC64 p571) */
3912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               UInt n = srcR->Prh.Imm.imm16;
3913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(!srcR->Prh.Imm.syned);
3914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               vassert(n > 0 && n < 64);
3915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXS(p, 31, r_srcL, r_dst, n, 413, 0);
3916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            } else {
3917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               /* srad (PPC32 p570) */
3918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 794, 0);
3919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            }
3920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
3924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
3925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AddSubC: {
3930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool isAdd  = i->Pin.AddSubC.isAdd;
3931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool setC   = i->Pin.AddSubC.setC;
3932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcL = iregNo(i->Pin.AddSubC.srcL, mode64);
3933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcR = iregNo(i->Pin.AddSubC.srcR, mode64);
3934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst  = iregNo(i->Pin.AddSubC.dst, mode64);
3935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (isAdd) {
3937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (setC) /* addc (PPC32 p348) */
3938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 10, 0);
3939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else          /* adde (PPC32 p349) */
3940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 138, 0);
3941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
3942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* subfX, with args the "wrong" way round */
3943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (setC) /* subfc (PPC32 p538) */
3944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 8, 0);
3945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else          /* subfe (PPC32 p539) */
3946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 136, 0);
3947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Cmp: {
3952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool syned  = i->Pin.Cmp.syned;
3953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool sz32   = i->Pin.Cmp.sz32;
3954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fld1   = i->Pin.Cmp.crfD << 2;
3955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcL = iregNo(i->Pin.Cmp.srcL, mode64);
3956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcR, imm_srcR;
3957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCRH* srcR = i->Pin.Cmp.srcR;
3958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64)        // cmp double word invalid for mode32
3960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(sz32);
3961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else if (!sz32)     // mode64 && cmp64: set L=1
3962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fld1 |= 1;
3963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (srcR->tag) {
3965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Prh_Imm:
3966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(syned == srcR->Prh.Imm.syned);
3967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         imm_srcR = srcR->Prh.Imm.imm16;
3968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (syned) {  // cmpw/di  (signed)   (PPC32 p368)
3969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(imm_srcR != 0x8000);
3970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 11, fld1, r_srcL, imm_srcR);
3971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {      // cmplw/di (unsigned) (PPC32 p370)
3972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 10, fld1, r_srcL, imm_srcR);
3973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
3974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Prh_Reg:
3976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_srcR = iregNo(srcR->Prh.Reg.reg, mode64);
3977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (syned)  // cmpwi  (signed)   (PPC32 p367)
3978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, fld1, r_srcL, r_srcR, 0, 0);
3979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else        // cmplwi (unsigned) (PPC32 p379)
3980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormX(p, 31, fld1, r_srcL, r_srcR, 32, 0);
3981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
3983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
3984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
3985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
3986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
3987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Unary: {
3989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst = iregNo(i->Pin.Unary.dst, mode64);
3990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_src = iregNo(i->Pin.Unary.src, mode64);
3991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.Unary.op) {
3993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_NOT:  // nor r_dst,r_src,r_src
3994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_src, r_dst, r_src, 124, 0);
3995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_NEG:  // neg r_dst,r_src
3997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormXO(p, 31, r_dst, r_src, 0, 0, 104, 0);
3998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
3999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_CLZ32:  // cntlzw r_dst, r_src
4000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_src, r_dst, 0, 26, 0);
4001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_CLZ64:  // cntlzd r_dst, r_src
4003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
4004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_src, r_dst, 0, 58, 0);
4005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pun_EXTSW:  // extsw r_dst, r_src
4007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(mode64);
4008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_src, r_dst, 0, 986, 0);
4009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default: goto bad;
4011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MulL: {
4016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool syned  = i->Pin.MulL.syned;
4017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool sz32   = i->Pin.MulL.sz32;
4018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst  = iregNo(i->Pin.MulL.dst, mode64);
4019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcL = iregNo(i->Pin.MulL.srcL, mode64);
4020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcR = iregNo(i->Pin.MulL.srcR, mode64);
4021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64)
4023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(sz32);
4024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.MulL.hi) {
4026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // mul hi words, must consider sign
4027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32) {
4028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (syned)  // mulhw r_dst,r_srcL,r_srcR
4029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 75, 0);
4030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else        // mulhwu r_dst,r_srcL,r_srcR
4031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 11, 0);
4032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {
4033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            if (syned)  // mulhd r_dst,r_srcL,r_srcR
4034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 73, 0);
4035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            else        // mulhdu r_dst,r_srcL,r_srcR
4036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 9, 0);
4037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // mul low word, sign is irrelevant
4040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(!i->Pin.MulL.syned);
4041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (sz32)      // mullw r_dst,r_srcL,r_srcR
4042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 235, 0);
4043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else           // mulld r_dst,r_srcL,r_srcR
4044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 233, 0);
4045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Div: {
4050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool syned  = i->Pin.Div.syned;
4051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool sz32   = i->Pin.Div.sz32;
4052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst  = iregNo(i->Pin.Div.dst, mode64);
4053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcL = iregNo(i->Pin.Div.srcL, mode64);
4054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_srcR = iregNo(i->Pin.Div.srcR, mode64);
4055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!mode64)
4057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(sz32);
4058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (i->Pin.Div.extended) {
4060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (sz32) {
4061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (syned)
4062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               // divwe r_dst,r_srcL,r_srcR
4063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 427, 0);
4064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
4065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               // divweu r_dst,r_srcL,r_srcR
4066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 395, 0);
4067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
4068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (syned)
4069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               // divde r_dst,r_srcL,r_srcR
4070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 425, 0);
4071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
4072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               // divdeu r_dst,r_srcL,r_srcR
4073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 393, 0);
4074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
4075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else if (sz32) {
4076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (syned)  // divw r_dst,r_srcL,r_srcR
4077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 491, 0);
4078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else        // divwu r_dst,r_srcL,r_srcR
4079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 459, 0);
4080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (syned)  // divd r_dst,r_srcL,r_srcR
4082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 489, 0);
4083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         else        // divdu r_dst,r_srcL,r_srcR
4084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 457, 0);
4085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Call: {
4090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (i->Pin.Call.cond.test != Pct_ALWAYS
4091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          && i->Pin.Call.rloc.pri != RLPri_None) {
4092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* The call might not happen (it isn't unconditional) and it
4093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            returns a result.  In this case we will need to generate a
4094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            control flow diamond to put 0x555..555 in the return
4095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            register(s) in the case where the call doesn't happen.  If
4096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            this ever becomes necessary, maybe copy code from the ARM
4097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            equivalent.  Until that day, just give up. */
4098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
4099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
4100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cond  = i->Pin.Call.cond;
4101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt        r_dst = 10;
4102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* As per detailed comment for Pin_Call in
4103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         getRegUsage_PPCInstr above, %r10 is used as an address temp */
4104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* jump over the following insns if condition does not hold */
4106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
4107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test != Pct_ALWAYS) {
4108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* jmp fwds if !condition */
4109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* don't know how many bytes to jump over yet...
4110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            make space for a jump instruction and fill in later. */
4111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ptmp = p; /* fill in this bit later */
4112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p += 4;                                          // p += 4
4113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* load target to r_dst */                          // p += 4|8|20
4116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkLoadImm(p, r_dst, i->Pin.Call.target, mode64);
4117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* mtspr 9,r_dst => move r_dst to count register */
4119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormXFX(p, r_dst, 9, 467);                    // p += 4
4120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* bctrl => branch to count register (and save to lr) */
4122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 1);      // p += 4
4123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Fix up the conditional jump, if there was one. */
4125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test != Pct_ALWAYS) {
4126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Int delta = p - ptmp;
4127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(delta >= 16 && delta <= 32);
4128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,delta */
4129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         mkFormB(ptmp, invertCondTest(cond.test),
4130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 cond.flag, (delta>>2), 0, 0);
4131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XDirect: {
4136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* NB: what goes on here has to be very closely coordinated
4137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         with the chainXDirect_PPC and unchainXDirect_PPC below. */
4138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We're generating chain-me requests here, so we need to be
4139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            sure this is actually allowed -- no-redir translations
4140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            can't use chain-me's.  Hence: */
4141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(disp_cp_chain_me_to_slowEP != NULL);
4142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(disp_cp_chain_me_to_fastEP != NULL);
4143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* First off, if this is conditional, create a conditional jump
4145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         over the rest of it.  Or at least, leave a space for it that
4146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         we will shortly fill in. */
4147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
4148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XDirect.cond.test != Pct_ALWAYS) {
4149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XDirect.cond.flag != Pcf_NONE);
4150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ptmp = p;
4151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p += 4;
4152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
4153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XDirect.cond.flag == Pcf_NONE);
4154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Update the guest CIA. */
4157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64 r30, dstGA */
4158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (!mode64) vassert(0 == (((ULong)i->Pin.XDirect.dstGA) >> 32));
4159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm(p, /*r*/30, (ULong)i->Pin.XDirect.dstGA, mode64);
4160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* stw/std r30, amCIA */
4161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_machine_word(
4162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             p, False/*!isLoad*/,
4163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             /*r*/30, i->Pin.XDirect.amCIA, mode64
4164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          );
4165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* --- FIRST PATCHABLE BYTE follows --- */
4167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* VG_(disp_cp_chain_me_to_{slowEP,fastEP}) (where we're calling
4168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         to) backs up the return address, so as to find the address of
4169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         the first patchable byte.  So: don't change the number of
4170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         instructions (32-bit: 4, 64-bit: 7) below. */
4171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64-fixed r30, VG_(disp_cp_chain_me_to_{slowEP,fastEP} */
4172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      void* disp_cp_chain_me
4173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               = i->Pin.XDirect.toFastEP ? disp_cp_chain_me_to_fastEP
4174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         : disp_cp_chain_me_to_slowEP;
4175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm_EXACTLY2or5(
4176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             p, /*r*/30, Ptr_to_ULong(disp_cp_chain_me), mode64);
4177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* mtctr r30 */
4178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFX(p, /*r*/30, 9, 467);
4179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bctrl */
4180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 1);
4181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* --- END of PATCHABLE BYTES --- */
4182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Fix up the conditional jump, if there was one. */
4184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XDirect.cond.test != Pct_ALWAYS) {
4185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         Int delta = p - ptmp;
4186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(delta >= 16 && delta <= 64 && 0 == (delta & 3));
4187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* bc !ct,cf,delta */
4188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         mkFormB(ptmp, invertCondTest(i->Pin.XDirect.cond.test),
4189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 i->Pin.XDirect.cond.flag, (delta>>2), 0, 0);
4190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
4191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
4192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XIndir: {
4195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We're generating transfers that could lead indirectly to a
4196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         chain-me, so we need to be sure this is actually allowed --
4197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         no-redir translations are not allowed to reach normal
4198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         translations without going through the scheduler.  That means
4199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         no XDirects or XIndirs out from no-redir translations.
4200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         Hence: */
4201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(disp_cp_xindir != NULL);
4202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* First off, if this is conditional, create a conditional jump
4204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         over the rest of it.  Or at least, leave a space for it that
4205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         we will shortly fill in. */
4206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
4207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XIndir.cond.test != Pct_ALWAYS) {
4208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XIndir.cond.flag != Pcf_NONE);
4209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ptmp = p;
4210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p += 4;
4211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
4212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XIndir.cond.flag == Pcf_NONE);
4213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Update the guest CIA. */
4216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* stw/std r-dstGA, amCIA */
4217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_machine_word(
4218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             p, False/*!isLoad*/,
4219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             iregNo(i->Pin.XIndir.dstGA, mode64),
4220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             i->Pin.XIndir.amCIA, mode64
4221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          );
4222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64 r30, VG_(disp_cp_xindir) */
4224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm(p, /*r*/30, (ULong)Ptr_to_ULong(disp_cp_xindir), mode64);
4225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* mtctr r30 */
4226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFX(p, /*r*/30, 9, 467);
4227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bctr */
4228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0);
4229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Fix up the conditional jump, if there was one. */
4231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XIndir.cond.test != Pct_ALWAYS) {
4232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         Int delta = p - ptmp;
4233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(delta >= 16 && delta <= 32 && 0 == (delta & 3));
4234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* bc !ct,cf,delta */
4235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         mkFormB(ptmp, invertCondTest(i->Pin.XIndir.cond.test),
4236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 i->Pin.XIndir.cond.flag, (delta>>2), 0, 0);
4237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
4239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
4240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_XAssisted: {
4242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* First off, if this is conditional, create a conditional jump
4243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         over the rest of it.  Or at least, leave a space for it that
4244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         we will shortly fill in. */
4245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
4246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XAssisted.cond.test != Pct_ALWAYS) {
4247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XAssisted.cond.flag != Pcf_NONE);
4248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ptmp = p;
4249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p += 4;
4250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(i->Pin.XAssisted.cond.flag == Pcf_NONE);
4252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Update the guest CIA. */
4255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* stw/std r-dstGA, amCIA */
4256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_machine_word(
4257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             p, False/*!isLoad*/,
4258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             iregNo(i->Pin.XIndir.dstGA, mode64),
4259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             i->Pin.XIndir.amCIA, mode64
4260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          );
4261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64 r31, $magic_number */
4263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt trcval = 0;
4264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.XAssisted.jk) {
4265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_ClientReq:   trcval = VEX_TRC_JMP_CLIENTREQ;   break;
4266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break;
4267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_Sys_int128:  trcval = VEX_TRC_JMP_SYS_INT128;  break;
4268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_Yield:       trcval = VEX_TRC_JMP_YIELD;       break;
4269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_EmWarn:      trcval = VEX_TRC_JMP_EMWARN;      break;
4270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_EmFail:      trcval = VEX_TRC_JMP_EMFAIL;      break;
4271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_MapFail:     trcval = VEX_TRC_JMP_MAPFAIL;     break;
4272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_NoDecode:    trcval = VEX_TRC_JMP_NODECODE;    break;
4273eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         case Ijk_InvalICache: trcval = VEX_TRC_JMP_INVALICACHE; break;
4274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_NoRedir:     trcval = VEX_TRC_JMP_NOREDIR;     break;
4275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_SigTRAP:     trcval = VEX_TRC_JMP_SIGTRAP;     break;
4276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_SigSEGV:     trcval = VEX_TRC_JMP_SIGSEGV;     break;
4277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_SigBUS:        trcval = VEX_TRC_JMP_SIGBUS;    break;
4278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case Ijk_Boring:      trcval = VEX_TRC_JMP_BORING;      break;
4279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* We don't expect to see the following being assisted. */
4280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_Ret:
4281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         //case Ijk_Call:
4282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* fallthrough */
4283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         default:
4284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            ppIRJumpKind(i->Pin.XAssisted.jk);
4285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            vpanic("emit_ARMInstr.Pin_XAssisted: unexpected jump kind");
4286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
4287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(trcval != 0);
4288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm(p, /*r*/31, trcval, mode64);
4289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* imm32/64 r30, VG_(disp_cp_xassisted) */
4291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm(p, /*r*/30,
4292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       (ULong)Ptr_to_ULong(disp_cp_xassisted), mode64);
4293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* mtctr r30 */
4294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFX(p, /*r*/30, 9, 467);
4295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bctr */
4296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0);
4297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Fix up the conditional jump, if there was one. */
4299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i->Pin.XAssisted.cond.test != Pct_ALWAYS) {
4300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Int delta = p - ptmp;
4301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(delta >= 16 && delta <= 32 && 0 == (delta & 3));
4302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,delta */
4303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         mkFormB(ptmp, invertCondTest(i->Pin.XAssisted.cond.test),
4304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 i->Pin.XAssisted.cond.flag, (delta>>2), 0, 0);
4305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_CMov: {
4310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt  r_dst, r_src;
4311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong imm_src;
4312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cond;
4313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(i->Pin.CMov.cond.test != Pct_ALWAYS);
4314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r_dst = iregNo(i->Pin.CMov.dst, mode64);
4316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      cond = i->Pin.CMov.cond;
4317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* branch (if cond fails) over move instrs */
4319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* ptmp = NULL;
4320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test != Pct_ALWAYS) {
4321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* don't know how many bytes to jump over yet...
4322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            make space for a jump instruction and fill in later. */
4323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ptmp = p; /* fill in this bit later */
4324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p += 4;
4325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // cond true: move src => dst
4328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.CMov.src->tag) {
4329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Imm:
4330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         imm_src = i->Pin.CMov.src->Pri.Imm;
4331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkLoadImm(p, r_dst, imm_src, mode64);  // p += 4|8|20
4332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pri_Reg:
4334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_src = iregNo(i->Pin.CMov.src->Pri.Reg, mode64);
4335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkMoveReg(p, r_dst, r_src);            // p += 4
4336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default: goto bad;
4338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Fix up the conditional jump, if there was one. */
4341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test != Pct_ALWAYS) {
4342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Int delta = p - ptmp;
4343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(delta >= 8 && delta <= 24);
4344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,delta */
4345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         mkFormB(ptmp, invertCondTest(cond.test),
4346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 cond.flag, (delta>>2), 0, 0);
4347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Load: {
4352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCAMode* am_addr = i->Pin.Load.src;
4353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_dst = iregNo(i->Pin.Load.dst, mode64);
4354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc1, opc2, sz = i->Pin.Load.sz;
4355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (am_addr->tag) {
4356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pam_IR:
4357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (mode64 && (sz == 4 || sz == 8)) {
4358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* should be guaranteed to us by iselWordExpr_AMode */
4359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(0 == (am_addr->Pam.IR.index & 3));
4360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch(sz) {
4362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 1:  opc1 = 34; break;
4363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 2:  opc1 = 40; break;
4364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 4:  opc1 = 32; break;
4365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 8:  opc1 = 58; vassert(mode64); break;
4366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            default: goto bad;
4367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = doAMode_IR(p, opc1, r_dst, am_addr, mode64);
4369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pam_RR:
4371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch(sz) {
4372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 1:  opc2 = 87;  break;
4373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 2:  opc2 = 279; break;
4374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 4:  opc2 = 23;  break;
4375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            case 8:  opc2 = 21; vassert(mode64); break;
4376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            default: goto bad;
4377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = doAMode_RR(p, 31, opc2, r_dst, am_addr, mode64);
4379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_LoadL: {
4386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.LoadL.sz == 4) {
4387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, iregNo(i->Pin.LoadL.dst, mode64),
4388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     0, iregNo(i->Pin.LoadL.src, mode64), 20, 0);
4389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.LoadL.sz == 8 && mode64) {
4392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, iregNo(i->Pin.LoadL.dst, mode64),
4393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     0, iregNo(i->Pin.LoadL.src, mode64), 84, 0);
4394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto bad;
4397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Set: {
4400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Make the destination register be 1 or 0, depending on whether
4401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         the relevant condition holds. */
4402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt        r_dst = iregNo(i->Pin.Set.dst, mode64);
4403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cond  = i->Pin.Set.cond;
4404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt rot_imm, r_tmp;
4405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cond.test == Pct_ALWAYS) {
4407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Just load 1 to dst => li dst,1
4408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormD(p, 14, r_dst, 0, 1);
4409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vassert(cond.flag != Pcf_NONE);
4411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         rot_imm = 1 + cond.flag;
4412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_tmp = 0;  // Not set in getAllocable, so no need to declare.
4413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // r_tmp = CR  => mfcr r_tmp
4415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, r_tmp, 0, 0, 19, 0);
4416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // r_dst = flag (rotate left and mask)
4418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         //  => rlwinm r_dst,r_tmp,rot_imm,31,31
4419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormM(p, 21, r_tmp, r_dst, rot_imm, 31, 31, 0);
4420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (cond.test == Pct_FALSE) {
4422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            // flip bit  => xori r_dst,r_dst,1
4423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = mkFormD(p, 26, r_dst, r_dst, 1);
4424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MfCR:
4430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // mfcr dst
4431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, iregNo(i->Pin.MfCR.dst, mode64), 0, 0, 19, 0);
4432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_MFence: {
4435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, 0, 0, 0, 598, 0);   // sync, PPC32 p616
4436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // CAB: Should this be isync?
4437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //    p = mkFormXL(p, 19, 0, 0, 0, 150, 0);  // isync, PPC32 p467
4438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_Store: {
4442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCAMode* am_addr = i->Pin.Store.dst;
4443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt r_src = iregNo(i->Pin.Store.src, mode64);
4444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc1, opc2, sz = i->Pin.Store.sz;
4445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.Store.dst->tag) {
4446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pam_IR:
4447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (mode64 && (sz == 4 || sz == 8)) {
4448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* should be guaranteed to us by iselWordExpr_AMode */
4449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            vassert(0 == (am_addr->Pam.IR.index & 3));
4450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch(sz) {
4452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 1: opc1 = 38; break;
4453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 2: opc1 = 44; break;
4454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 4: opc1 = 36; break;
4455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 8: vassert(mode64);
4456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 opc1 = 62; break;
4457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         default:
4458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            goto bad;
4459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = doAMode_IR(p, opc1, r_src, am_addr, mode64);
4461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pam_RR:
4463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         switch(sz) {
4464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 1: opc2 = 215; break;
4465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 2: opc2 = 407; break;
4466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 4: opc2 = 151; break;
4467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 8: vassert(mode64);
4468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 opc2 = 149; break;
4469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         default:
4470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            goto bad;
4471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = doAMode_RR(p, 31, opc2, r_src, am_addr, mode64);
4473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_StoreC: {
4481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.StoreC.sz == 4) {
4482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, iregNo(i->Pin.StoreC.src, mode64),
4483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     0, iregNo(i->Pin.StoreC.dst, mode64), 150, 1);
4484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.StoreC.sz == 8 && mode64) {
4487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, iregNo(i->Pin.StoreC.src, mode64),
4488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     0, iregNo(i->Pin.StoreC.dst, mode64), 214, 1);
4489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto bad;
4492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpUnary: {
4495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst = fregNo(i->Pin.FpUnary.dst);
4496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_src = fregNo(i->Pin.FpUnary.src);
4497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.FpUnary.op) {
4498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_RSQRTE: // frsqrtre, PPC32 p424
4499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, 0, fr_src, 0, 26, 0 );
4500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_RES:   // fres, PPC32 p421
4502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, 0, fr_src, 0, 24, 0 );
4503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_SQRT:  // fsqrt, PPC32 p427
4505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, 0, fr_src, 0, 22, 0 );
4506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_ABS:   // fabs, PPC32 p399
4508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 264, 0);
4509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_NEG:   // fneg, PPC32 p416
4511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 40, 0);
4512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MOV:   // fmr, PPC32 p410
4514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 72, 0);
4515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIM:  // frim, PPC ISA 2.05 p137
4517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 488, 0);
4518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIP:  // frip, PPC ISA 2.05 p137
4520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 456, 0);
4521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIN:  // frin, PPC ISA 2.05 p137
4523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 392, 0);
4524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_FRIZ:  // friz, PPC ISA 2.05 p137
4526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 63, fr_dst, 0, fr_src, 424, 0);
4527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpBinary: {
4535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst  = fregNo(i->Pin.FpBinary.dst);
4536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcL = fregNo(i->Pin.FpBinary.srcL);
4537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcR = fregNo(i->Pin.FpBinary.srcR);
4538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.FpBinary.op) {
4539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_ADDD:   // fadd, PPC32 p400
4540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 21, 0 );
4541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_ADDS:   // fadds, PPC32 p401
4543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 21, 0 );
4544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_SUBD:   // fsub, PPC32 p429
4546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 20, 0 );
4547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_SUBS:   // fsubs, PPC32 p430
4549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 20, 0 );
4550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MULD:   // fmul, PPC32 p413
4552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcL, 0, fr_srcR, 25, 0 );
4553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MULS:   // fmuls, PPC32 p414
4555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcL, 0, fr_srcR, 25, 0 );
4556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_DIVD:   // fdiv, PPC32 p406
4558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 18, 0 );
4559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_DIVS:   // fdivs, PPC32 p407
4561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 18, 0 );
4562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpMulAcc: {
4570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst    = fregNo(i->Pin.FpMulAcc.dst);
4571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcML  = fregNo(i->Pin.FpMulAcc.srcML);
4572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcMR  = fregNo(i->Pin.FpMulAcc.srcMR);
4573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_srcAcc = fregNo(i->Pin.FpMulAcc.srcAcc);
4574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.FpMulAcc.op) {
4575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MADDD:   // fmadd, PPC32 p408
4576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 29, 0 );
4577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MADDS:   // fmadds, PPC32 p409
4579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 29, 0 );
4580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MSUBD:   // fmsub, PPC32 p411
4582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 63, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 28, 0 );
4583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pfp_MSUBS:   // fmsubs, PPC32 p412
4585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormA( p, 59, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 28, 0 );
4586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdSt: {
4594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCAMode* am_addr = i->Pin.FpLdSt.addr;
4595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt f_reg = fregNo(i->Pin.FpLdSt.reg);
4596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool idxd = toBool(i->Pin.FpLdSt.addr->tag == Pam_RR);
4597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz = i->Pin.FpLdSt.sz;
4598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc;
4599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(sz == 4 || sz == 8);
4600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpLdSt.isLoad) {   // Load from memory
4602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (idxd) {  // lf[s|d]x, PPC32 p444|440
4603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            opc = (sz == 4) ? 535 : 599;
4604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = doAMode_RR(p, 31, opc, f_reg, am_addr, mode64);
4605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {     // lf[s|d], PPC32 p441|437
4606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            opc = (sz == 4) ? 48 : 50;
4607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = doAMode_IR(p, opc, f_reg, am_addr, mode64);
4608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {                      // Store to memory
4610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (idxd) { // stf[s|d]x, PPC32 p521|516
4611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            opc = (sz == 4) ? 663 : 727;
4612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = doAMode_RR(p, 31, opc, f_reg, am_addr, mode64);
4613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else {    // stf[s|d], PPC32 p518|513
4614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            opc = (sz == 4) ? 52 : 54;
4615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            p = doAMode_IR(p, opc, f_reg, am_addr, mode64);
4616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         }
4617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpSTFIW: {
4622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt ir_addr = iregNo(i->Pin.FpSTFIW.addr, mode64);
4623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_data = fregNo(i->Pin.FpSTFIW.data);
4624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // stfiwx (store fp64[lo32] as int32), PPC32 p517
4625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Use rA==0, so that EA == rB == ir_addr
4626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, fr_data, 0/*rA=0*/, ir_addr, 983, 0);
4627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpRSP: {
4631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst = fregNo(i->Pin.FpRSP.dst);
4632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_src = fregNo(i->Pin.FpRSP.src);
4633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // frsp, PPC32 p423
4634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 63, fr_dst, 0, fr_src, 12, 0);
4635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCftI: {
4639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_dst = fregNo(i->Pin.FpCftI.dst);
4640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_src = fregNo(i->Pin.FpCftI.src);
4641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == True) {
4642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True) {
4643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fctiw (conv f64 to i32), PPC32 p404
4644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 14, 0);
4645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
4647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fctiwu (conv f64 to u32)
4648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 142, 0);
4649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
4651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == False) {
4653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True) {
4654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fctid (conv f64 to i64), PPC64 p437
4655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 814, 0);
4656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
4658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fctidu (conv f64 to u64)
4659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 942, 0);
4660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
4662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) {
4664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (i->Pin.FpCftI.syned == True) {
4665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fcfid (conv i64 to f64), PPC64 p434
4666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 846, 0);
4667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else if (i->Pin.FpCftI.flt64 == True) {
4669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fcfidu (conv u64 to f64)
4670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 63, fr_dst, 0, fr_src, 974, 0);
4671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
4673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // fcfidus (conv u64 to f32)
4674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            p = mkFormX(p, 59, fr_dst, 0, fr_src, 974, 0);
4675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            goto done;
4676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
4677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto bad;
4679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCMov: {
4682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt        fr_dst = fregNo(i->Pin.FpCMov.dst);
4683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt        fr_src = fregNo(i->Pin.FpCMov.src);
4684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cc     = i->Pin.FpCMov.cond;
4685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (fr_dst == fr_src) goto done;
4687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(cc.test != Pct_ALWAYS);
4689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* jmp fwds if !condition */
4691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cc.test != Pct_ALWAYS) {
4692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,n_bytes>>2 */
4693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormB(p, invertCondTest(cc.test), cc.flag, 8>>2, 0, 0);
4694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // fmr, PPC32 p410
4697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 63, fr_dst, 0, fr_src, 72, 0);
4698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpLdFPSCR: {
4702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt fr_src = fregNo(i->Pin.FpLdFPSCR.src);
4703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFL(p, 0xFF, fr_src, i->Pin.FpLdFPSCR.dfp_rm);     // mtfsf, PPC32 p480
4704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_FpCmp: {
4708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar crfD    = 1;
4709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt  r_dst   = iregNo(i->Pin.FpCmp.dst, mode64);
4710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt  fr_srcL = fregNo(i->Pin.FpCmp.srcL);
4711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt  fr_srcR = fregNo(i->Pin.FpCmp.srcR);
4712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(crfD < 8);
4713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // fcmpo, PPC32 p402
4714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 63, crfD<<2, fr_srcL, fr_srcR, 32, 0);
4715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // mfcr (mv CR to r_dst), PPC32 p467
4717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormX(p, 31, r_dst, 0, 0, 19, 0);
4718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // rlwinm r_dst,r_dst,8,28,31, PPC32 p501
4720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //  => rotate field 1 to bottomw of word, masking out upper 28
4721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0);
4722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_RdWrLR: {
4726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt reg = iregNo(i->Pin.RdWrLR.gpr, mode64);
4727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* wrLR==True ? mtlr r4 : mflr r4 */
4728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormXFX(p, reg, 8, (i->Pin.RdWrLR.wrLR==True) ? 467 : 339);
4729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* AltiVec */
4734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdSt: {
4735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2, v_reg, r_idx, r_base;
4736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz   = i->Pin.AvLdSt.sz;
4737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool  idxd = toBool(i->Pin.AvLdSt.addr->tag == Pam_RR);
4738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(sz == 1 || sz == 2 || sz == 4 || sz == 16);
4739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      v_reg  = vregNo(i->Pin.AvLdSt.reg);
4741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      r_base = iregNo(i->Pin.AvLdSt.addr->Pam.RR.base, mode64);
4742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Only have AltiVec AMode_RR: kludge AMode_IR
4744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (!idxd) {
4745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_idx = 30;                       // XXX: Using r30 as temp
4746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkLoadImm(p, r_idx,
4747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       i->Pin.AvLdSt.addr->Pam.IR.index, mode64);
4748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
4749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         r_idx  = iregNo(i->Pin.AvLdSt.addr->Pam.RR.index, mode64);
4750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.FpLdSt.isLoad) {  // Load from memory (1,2,4,16)
4753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         opc2 = (sz==1) ?   7 : (sz==2) ?  39 : (sz==4) ?  71 : 103;
4754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, v_reg, r_idx, r_base, opc2, 0);
4755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {                      // Store to memory (1,2,4,16)
4756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         opc2 = (sz==1) ? 135 : (sz==2) ? 167 : (sz==4) ? 199 : 231;
4757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormX(p, 31, v_reg, r_idx, r_base, opc2, 0);
4758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUnary: {
4763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst = vregNo(i->Pin.AvUnary.dst);
4764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src = vregNo(i->Pin.AvUnary.src);
4765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvUnary.op) {
4767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MOV:       opc2 = 1156; break; // vor vD,vS,vS
4768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_NOT:       opc2 = 1284; break; // vnor vD,vS,vS
4769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKH8S:  opc2 =  526; break; // vupkhsb
4770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKH16S: opc2 =  590; break; // vupkhsh
4771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKL8S:  opc2 =  654; break; // vupklsb
4772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKL16S: opc2 =  718; break; // vupklsh
4773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKHPIX: opc2 =  846; break; // vupkhpx
4774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_UNPCKLPIX: opc2 =  974; break; // vupklpx
4775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_ZEROCNTBYTE: opc2 = 1794; break; // vclzb
4777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_ZEROCNTHALF: opc2 = 1858; break; // vclzh
4778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_ZEROCNTWORD: opc2 = 1922; break; // vclzw
4779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_ZEROCNTDBL:  opc2 = 1986; break; // vclzd
4780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_BITMTXXPOSE: opc2 = 1292; break; // vgbbd
4781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvUnary.op) {
4785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MOV:
4786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_NOT:
4787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_src, v_src, opc2 );
4788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, 0, v_src, opc2 );
4791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
4792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBinary: {
4797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBinary.dst);
4798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBinary.srcL);
4799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBinary.srcR);
4800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvBinary.op == Pav_SHL) {
4802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1036 ); // vslo
4803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_dst,  v_srcR, 452 );  // vsl
4804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvBinary.op == Pav_SHR) {
4807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1100 ); // vsro
4808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_dst,  v_srcR, 708 );  // vsr
4809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto done;
4810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBinary.op) {
4812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Bitwise */
4813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AND:       opc2 = 1028; break; // vand
4814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OR:        opc2 = 1156; break; // vor
4815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_XOR:       opc2 = 1220; break; // vxor
4816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
4820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin8x16: {
4824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBin8x16.dst);
4825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBin8x16.srcL);
4826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBin8x16.srcR);
4827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBin8x16.op) {
4829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ADDU:     opc2 =    0; break; // vaddubm
4831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDU:    opc2 =  512; break; // vaddubs
4832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDS:    opc2 =  768; break; // vaddsbs
4833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SUBU:     opc2 = 1024; break; // vsububm
4835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBU:    opc2 = 1536; break; // vsububs
4836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBS:    opc2 = 1792; break; // vsubsbs
4837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OMULU:   opc2 =    8; break; // vmuloub
4839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OMULS:   opc2 =  264; break; // vmulosb
4840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_EMULU:   opc2 =  520; break; // vmuleub
4841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_EMULS:   opc2 =  776; break; // vmulesb
4842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGU:     opc2 = 1026; break; // vavgub
4844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGS:     opc2 = 1282; break; // vavgsb
4845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXU:     opc2 =    2; break; // vmaxub
4846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXS:     opc2 =  258; break; // vmaxsb
4847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINU:     opc2 =  514; break; // vminub
4848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINS:     opc2 =  770; break; // vminsb
4849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPEQU:   opc2 =    6; break; // vcmpequb
4851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTU:   opc2 =  518; break; // vcmpgtub
4852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTS:   opc2 =  774; break; // vcmpgtsb
4853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHL:      opc2 =  260; break; // vslb
4855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHR:      opc2 =  516; break; // vsrb
4856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SAR:      opc2 =  772; break; // vsrab
4857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ROTL:     opc2 =    4; break; // vrlb
4858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGHI:    opc2 =   12; break; // vmrghb
4860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGLO:    opc2 =  268; break; // vmrglb
4861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_POLYMULADD: opc2 = 1032; break; // vpmsumb
4863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
4868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin16x8: {
4872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBin16x8.dst);
4873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBin16x8.srcL);
4874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBin16x8.srcR);
4875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBin16x8.op) {
4877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ADDU:    opc2 =   64; break; // vadduhm
4879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDU:   opc2 =  576; break; // vadduhs
4880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDS:   opc2 =  832; break; // vaddshs
4881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SUBU:    opc2 = 1088; break; // vsubuhm
4883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBU:   opc2 = 1600; break; // vsubuhs
4884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBS:   opc2 = 1856; break; // vsubshs
4885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OMULU:   opc2 =   72; break; // vmulouh
4887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_OMULS:   opc2 =  328; break; // vmulosh
4888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_EMULU:   opc2 =  584; break; // vmuleuh
4889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_EMULS:   opc2 =  840; break; // vmulesh
4890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGU:    opc2 = 1090; break; // vavguh
4892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGS:    opc2 = 1346; break; // vavgsh
4893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXU:    opc2 =   66; break; // vmaxuh
4894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXS:    opc2 =  322; break; // vmaxsh
4895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINS:    opc2 =  834; break; // vminsh
4896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINU:    opc2 =  578; break; // vminuh
4897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPEQU:  opc2 =   70; break; // vcmpequh
4899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTU:  opc2 =  582; break; // vcmpgtuh
4900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTS:  opc2 =  838; break; // vcmpgtsh
4901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHL:     opc2 =  324; break; // vslh
4903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHR:     opc2 =  580; break; // vsrh
4904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SAR:     opc2 =  836; break; // vsrah
4905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ROTL:    opc2 =   68; break; // vrlh
4906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_PACKUU:  opc2 =   14; break; // vpkuhum
4908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKUU: opc2 =  142; break; // vpkuhus
4909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKSU: opc2 =  270; break; // vpkshus
4910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKSS: opc2 =  398; break; // vpkshss
4911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_PACKPXL: opc2 =  782; break; // vpkpx
4912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGHI:   opc2 =   76; break; // vmrghh
4914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGLO:   opc2 =  332; break; // vmrglh
4915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_POLYMULADD: opc2 = 1224; break; // vpmsumh
4917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
4922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32x4: {
4926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBin32x4.dst);
4927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBin32x4.srcL);
4928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBin32x4.srcR);
4929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
4930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBin32x4.op) {
4931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ADDU:    opc2 =  128; break; // vadduwm
4933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDU:   opc2 =  640; break; // vadduws
4934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QADDS:   opc2 =  896; break; // vaddsws
4935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SUBU:    opc2 = 1152; break; // vsubuwm
4937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBU:   opc2 = 1664; break; // vsubuws
4938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QSUBS:   opc2 = 1920; break; // vsubsws
4939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_MULU:    opc2 =  137; break; // vmuluwm
4941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_OMULU:   opc2 =  136; break; // vmulouw
4942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_OMULS:   opc2 =  392; break; // vmulosw
4943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_EMULU:   opc2 =  648; break; // vmuleuw
4944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_EMULS:   opc2 =  904; break; // vmulesw
4945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGU:    opc2 = 1154; break; // vavguw
4947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_AVGS:    opc2 = 1410; break; // vavgsw
4948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXU:    opc2 =  130; break; // vmaxuw
4950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MAXS:    opc2 =  386; break; // vmaxsw
4951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINS:    opc2 =  898; break; // vminsw
4953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MINU:    opc2 =  642; break; // vminuw
4954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPEQU:  opc2 =  134; break; // vcmpequw
4956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTS:  opc2 =  902; break; // vcmpgtsw
4957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_CMPGTU:  opc2 =  646; break; // vcmpgtuw
4958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHL:     opc2 =  388; break; // vslw
4960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SHR:     opc2 =  644; break; // vsrw
4961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_SAR:     opc2 =  900; break; // vsraw
4962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_ROTL:    opc2 =  132; break; // vrlw
4963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_PACKUU:  opc2 =   78; break; // vpkuwum
4965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKUU: opc2 =  206; break; // vpkuwus
4966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKSU: opc2 =  334; break; // vpkswus
4967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_QPACKSS: opc2 =  462; break; // vpkswss
4968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGHI:   opc2 =  140; break; // vmrghw
4970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pav_MRGLO:   opc2 =  396; break; // vmrglw
4971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_CATODD:  opc2 = 1676; break; // vmrgow
4973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_CATEVEN: opc2 = 1932; break; // vmrgew
4974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_POLYMULADD: opc2 = 1160; break; // vpmsumw
4976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
4978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
4979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
4980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
4981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
4982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
4983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvBin64x2: {
4985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_dst  = vregNo(i->Pin.AvBin64x2.dst);
4986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_srcL = vregNo(i->Pin.AvBin64x2.srcL);
4987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_srcR = vregNo(i->Pin.AvBin64x2.srcR);
4988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt opc2;
4989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (i->Pin.AvBin64x2.op) {
4990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_ADDU:    opc2 =  192; break; // vaddudm  vector double add
4991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_SUBU:    opc2 = 1216; break; // vsubudm  vector double add
4992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_MAXU:    opc2 =  194; break; // vmaxud   vector double max
4993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_MAXS:    opc2 =  450; break; // vmaxsd   vector double max
4994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_MINU:    opc2 =  706; break; // vminud   vector double min
4995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_MINS:    opc2 =  962; break; // vminsd   vector double min
4996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_CMPEQU:  opc2 =  199; break; // vcmpequd vector double compare
4997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_CMPGTU:  opc2 =  711; break; // vcmpgtud vector double compare
4998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_CMPGTS:  opc2 =  967; break; // vcmpgtsd vector double compare
4999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_SHL:     opc2 = 1476; break; // vsld
5000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_SHR:     opc2 = 1732; break; // vsrd
5001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_SAR:     opc2 =  964; break; // vsrad
5002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_ROTL:    opc2 =  196; break; // vrld
5003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_PACKUU:  opc2 = 1102; break; // vpkudum
5004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_QPACKUU: opc2 = 1230; break; // vpkudus, vpksdus (emulated)
5005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_QPACKSS: opc2 = 1486; break; // vpksdsm
5006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_MRGHI:   opc2 = 1614; break; // vmrghw
5007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_MRGLO:   opc2 = 1742; break; // vmrglw
5008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_POLYMULADD: opc2 = 1096; break; // vpmsumd
5009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
5010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
5011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
5013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      goto done;
5014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
5015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvCipherV128Unary: {
5016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_dst = vregNo(i->Pin.AvCipherV128Unary.dst);
5017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_src = vregNo(i->Pin.AvCipherV128Unary.src);
5018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt opc2;
5019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (i->Pin.AvCipherV128Unary.op) {
5020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_CIPHERSUBV128:   opc2 =  1480; break; // vsbox
5021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
5022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
5023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      p = mkFormVX( p, 4, v_dst, v_src, 0, opc2 );
5025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      goto done;
5026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
5027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvCipherV128Binary: {
5028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_dst  = vregNo(i->Pin.AvCipherV128Binary.dst);
5029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_srcL = vregNo(i->Pin.AvCipherV128Binary.srcL);
5030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_srcR = vregNo(i->Pin.AvCipherV128Binary.srcR);
5031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt opc2;
5032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (i->Pin.AvCipherV128Binary.op) {
5033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_CIPHERV128:     opc2 =  1288; break; // vcipher
5034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_CIPHERLV128:    opc2 =  1289; break; // vcipherlast
5035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_NCIPHERV128:    opc2 =  1352; break; // vncipher
5036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_NCIPHERLV128:   opc2 =  1353; break; // vncipherlast
5037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
5038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
5039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 );
5041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      goto done;
5042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
5043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvHashV128Binary: {
5044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_dst = vregNo(i->Pin.AvHashV128Binary.dst);
5045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_src = vregNo(i->Pin.AvHashV128Binary.src);
5046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PPCRI* s_field = i->Pin.AvHashV128Binary.s_field;
5047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt opc2;
5048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (i->Pin.AvHashV128Binary.op) {
5049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_SHA256:   opc2 =  1666; break; // vshasigmaw
5050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_SHA512:   opc2 =  1730; break; // vshasigmad
5051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
5052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
5053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      p = mkFormVX( p, 4, v_dst, v_src, s_field->Pri.Imm, opc2 );
5055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      goto done;
5056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
5057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case Pin_AvBCDV128Trinary: {
5058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_dst  = vregNo(i->Pin.AvBCDV128Trinary.dst);
5059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_src1 = vregNo(i->Pin.AvBCDV128Trinary.src1);
5060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt v_src2 = vregNo(i->Pin.AvBCDV128Trinary.src2);
5061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      PPCRI* ps   = i->Pin.AvBCDV128Trinary.ps;
5062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt opc2;
5063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (i->Pin.AvBCDV128Trinary.op) {
5064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_BCDAdd:   opc2 =  1; break; // bcdadd
5065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case Pav_BCDSub:   opc2 = 65; break; // bcdsub
5066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
5067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto bad;
5068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
5069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      p = mkFormVXR( p, 4, v_dst, v_src1, v_src2,
5070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     0x1, (ps->Pri.Imm << 9) | opc2 );
5071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      goto done;
5072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
5073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvBin32Fx4: {
5074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvBin32Fx4.dst);
5075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvBin32Fx4.srcL);
5076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvBin32Fx4.srcR);
5077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvBin32Fx4.op) {
5078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ADDF:
5080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 10 );   // vaddfp
5081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
5082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_SUBF:
5083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 74 );   // vsubfp
5084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
5085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_MAXF:
5086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1034 ); // vmaxfp
5087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
5088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_MINF:
5089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1098 ); // vminfp
5090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
5091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_MULF: {
5093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* Make a vmulfp from a vmaddfp:
5094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            load -0.0 (0x8000_0000) to each 32-bit word of vB
5095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            this makes the add a noop.
5096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         */
5097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt vB = 29;  // XXX: Using v29 for temp do not change
5098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        // without also changing
5099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                        // getRegUsage_PPCInstr
5100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt konst = 0x1F;
5101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Better way to load -0.0 (0x80000000) ?
5103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // vspltisw vB,0x1F   (0x1F => each word of vB)
5104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, vB, konst, 0, 908 );
5105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // vslw vB,vB,vB (each word of vB = (0x1F << 0x1F) = 0x80000000
5107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, vB, vB, vB, 388 );
5108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Finally, do the multiply:
5110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVA( p, 4, v_dst, v_srcL, vB, v_srcR, 46 );
5111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
5112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CMPEQF:  // vcmpeqfp
5114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 198 );
5115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
5116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CMPGTF:  // vcmpgtfp
5117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 710 );
5118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
5119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CMPGEF:  // vcmpgefp
5120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 454 );
5121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         break;
5122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
5124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
5125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
5127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvUn32Fx4: {
5130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst = vregNo(i->Pin.AvUn32Fx4.dst);
5131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src = vregNo(i->Pin.AvUn32Fx4.src);
5132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt opc2;
5133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (i->Pin.AvUn32Fx4.op) {
5134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_RCPF:    opc2 =  266; break; // vrefp
5135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_RSQRTF:  opc2 =  330; break; // vrsqrtefp
5136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CVTU2F:  opc2 =  778; break; // vcfux
5137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_CVTS2F:  opc2 =  842; break; // vcfsx
5138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_QCVTF2U: opc2 =  906; break; // vctuxs
5139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_QCVTF2S: opc2 =  970; break; // vctsxs
5140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ROUNDM:  opc2 =  714; break; // vrfim
5141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ROUNDP:  opc2 =  650; break; // vrfip
5142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ROUNDN:  opc2 =  522; break; // vrfin
5143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      case Pavfp_ROUNDZ:  opc2 =  586; break; // vrfiz
5144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      default:
5145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         goto bad;
5146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, 0, v_src, opc2 );
5148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
5149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvPerm: {  // vperm
5152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvPerm.dst);
5153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvPerm.srcL);
5154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvPerm.srcR);
5155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_ctl  = vregNo(i->Pin.AvPerm.ctl);
5156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, v_ctl, 43 );
5157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
5158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSel: {  // vsel
5161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_ctl  = vregNo(i->Pin.AvSel.ctl);
5162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvSel.dst);
5163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvSel.srcL);
5164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvSel.srcR);
5165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, v_ctl, 42 );
5166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
5167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvShlDbl: {  // vsldoi
5170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt shift  = i->Pin.AvShlDbl.shift;
5171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst  = vregNo(i->Pin.AvShlDbl.dst);
5172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcL = vregNo(i->Pin.AvShlDbl.srcL);
5173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_srcR = vregNo(i->Pin.AvShlDbl.srcR);
5174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(shift <= 0xF);
5175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, shift, 44 );
5176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
5177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvSplat: { // vsplt(is)(b,h,w)
5180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst = vregNo(i->Pin.AvShlDbl.dst);
5181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar sz   = i->Pin.AvSplat.sz;
5182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src, opc2;
5183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(sz == 8 || sz == 16 || sz == 32);
5184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (i->Pin.AvSplat.src->tag == Pvi_Imm) {
5186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Char simm5;
5187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         opc2 = (sz == 8) ? 780 : (sz == 16) ? 844 : 908;   // 8,16,32
5188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* expects 5-bit-signed-imm */
5189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         simm5 = i->Pin.AvSplat.src->Pvi.Imm5s;
5190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(simm5 >= -16 && simm5 <= 15);
5191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         simm5 = simm5 & 0x1F;
5192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, (UInt)simm5, 0, opc2 );
5193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      else {  // Pri_Reg
5195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         UInt lowest_lane;
5196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         opc2 = (sz == 8) ? 524 : (sz == 16) ? 588 : 652;  // 8,16,32
5197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         vassert(hregClass(i->Pin.AvSplat.src->Pvi.Reg) == HRcVec128);
5198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         v_src = vregNo(i->Pin.AvSplat.src->Pvi.Reg);
5199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         lowest_lane = (128/sz)-1;
5200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormVX( p, 4, v_dst, lowest_lane, v_src, opc2 );
5201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
5203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvCMov: {
5206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_dst     = vregNo(i->Pin.AvCMov.dst);
5207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src     = vregNo(i->Pin.AvCMov.src);
5208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PPCCondCode cc = i->Pin.AvCMov.cond;
5209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (v_dst == v_src) goto done;
5211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      vassert(cc.test != Pct_ALWAYS);
5213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* jmp fwds 2 insns if !condition */
5215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (cc.test != Pct_ALWAYS) {
5216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         /* bc !ct,cf,n_bytes>>2 */
5217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p = mkFormB(p, invertCondTest(cc.test), cc.flag, 8>>2, 0, 0);
5218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
5219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* vmr */
5220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, v_dst, v_src, v_src, 1156 );
5221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
5222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   case Pin_AvLdVSCR: {  // mtvscr
5225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt v_src = vregNo(i->Pin.AvLdVSCR.src);
5226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = mkFormVX( p, 4, 0, 0, v_src, 1604 );
5227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto done;
5228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Unary: {
5231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst = fregNo( i->Pin.FpUnary.dst );
5232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src = fregNo( i->Pin.FpUnary.src );
5233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp64Unary.op) {
5235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_MOV: // fmr, PPC32 p410
5236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, fr_dst, 0, fr_src, 72, 0 );
5237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCTDP:   // D32 to D64
5239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 258, 0 );
5240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DRSP:    // D64 to D32
5242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 770, 0 );
5243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCFFIX:   // I64 to D64 conversion
5245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* ONLY WORKS ON POWER7 */
5246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 802, 0);
5247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCTFIX:   // D64 to I64 conversion
5249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 290, 0);
5250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DXEX:     // Extract exponent
5252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, 0, fr_src, 354, 0 );
5253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Binary: {
5261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst = fregNo( i->Pin.Dfp64Binary.dst );
5262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcL = fregNo( i->Pin.Dfp64Binary.srcL );
5263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcR = fregNo( i->Pin.Dfp64Binary.srcR );
5264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp64Binary.op) {
5265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPADD: /* dadd, dfp add, use default RM from reg ignore mode
5266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        * from the Iop instruction. */
5267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 2, 0 );
5268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPSUB: /* dsub, dfp subtract, use default RM from reg ignore
5270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        * mode from the Iop instruction. */
5271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 514, 0 );
5272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPMUL: /* dmul, dfp multipy, use default RM from reg ignore
5274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        * mode from the Iop instruction. */
5275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 34, 0 );
5276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPDIV: /* ddiv, dfp divide, use default RM from reg ignore
5278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        * mode from the Iop instruction. */
5279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 546, 0 );
5280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DIEX:  /* diex, insert exponent */
5282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 866, 0 );
5283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift: {
5291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src = fregNo(i->Pin.DfpShift.src);
5292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst = fregNo(i->Pin.DfpShift.dst);
5293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt shift;
5294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      shift =  i->Pin.DfpShift.shift->Pri.Imm;
5296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.DfpShift.op) {
5298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DSCLI:    /* dscli, DFP shift left by fr_srcR */
5299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ22( p, 59, fr_dst, fr_src, shift,  66, 0 );
5300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DSCRI:    /* dscri, DFP shift right by fr_srcR */
5302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ22( p, 59, fr_dst, fr_src, shift,  98, 0 );
5303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("ERROR: emit_PPCInstr default case\n");
5306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ExtractExpD128: {
5312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst   = fregNo(i->Pin.ExtractExpD128.dst);
5313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcHi = fregNo(i->Pin.ExtractExpD128.src_hi);
5314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcLo = fregNo(i->Pin.ExtractExpD128.src_lo);
5315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.ExtractExpD128.op) {
5317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DXEXQ:
5318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Setup the upper and lower registers of the source operand
5319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * register pair.
5320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          */
5321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 12, 0, fr_srcHi, 72, 0);
5322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 13, 0, fr_srcLo, 72, 0);
5323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 0, 12, 354, 0 );
5324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* The instruction will put the 64-bit result in
5326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          * register 10.
5327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          */
5328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX(p, 63, fr_dst, 0, 10,  72, 0);
5329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("Error: emit_PPCInstr case Pin_DfpExtractExp, case inst Default\n");
5332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Unary: {
5337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     UInt fr_dstHi = fregNo(i->Pin.Dfp128Unary.dst_hi);
5338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     UInt fr_dstLo = fregNo(i->Pin.Dfp128Unary.dst_lo);
5339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     UInt fr_srcLo = fregNo(i->Pin.Dfp128Unary.src_lo);
5340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     /* Do instruction with 128-bit source operands in registers (10,11)
5342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      * and (12,13).
5343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      */
5344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     switch (i->Pin.Dfp128Unary.op) {
5345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     case Pfp_DCTQPQ: // D64 to D128, srcLo holds 64 bit operand
5346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        p = mkFormX( p, 63, 12, 0, fr_srcLo, 72, 0);
5347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        p = mkFormX( p, 63, 10, 0, 12, 258, 0 );
5349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* The instruction will put the 128-bit result in
5351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         * registers (10,11).  Note, the operand in the instruction only
5352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         * reference the first of the two registers in the pair.
5353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         */
5354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        break;
5357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     default:
5358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        vex_printf("Error: emit_PPCInstr case Pin_Dfp128Unary, case inst Default\
5359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng\n");
5360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        goto bad;
5361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     }
5362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     goto done;
5363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Binary: {
5366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* dst is used to supply the  left source operand and return
5367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * the result.
5368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstHi = fregNo( i->Pin.Dfp128Binary.dst_hi );
5370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstLo = fregNo( i->Pin.Dfp128Binary.dst_lo );
5371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcRHi = fregNo( i->Pin.Dfp128Binary.srcR_hi );
5372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcRLo = fregNo( i->Pin.Dfp128Binary.srcR_lo );
5373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 10, 0, fr_dstHi, 72, 0 );
5378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 11, 0, fr_dstLo, 72, 0 );
5379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 12, 0, fr_srcRHi, 72, 0 );
5380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 13, 0, fr_srcRLo, 72, 0 );
5381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Do instruction with 128-bit source operands in registers (10,11)
5383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * and (12,13).
5384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp128Binary.op) {
5386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPADDQ:
5387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 10, 12, 2, 0 );
5388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPSUBQ:
5390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 10, 12, 514, 0 );
5391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPMULQ:
5393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 10, 12, 34, 0 );
5394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DFPDIVQ:
5396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 10, 12, 546, 0 );
5397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 128-bit result in
5403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (10,11).  Note, the operand in the instruction only
5404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * reference the first of the two registers in the pair.
5405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpShift128: {
5412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src_hi = fregNo(i->Pin.DfpShift128.src_hi);
5413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src_lo = fregNo(i->Pin.DfpShift128.src_lo);
5414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst_hi = fregNo(i->Pin.DfpShift128.dst_hi);
5415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst_lo = fregNo(i->Pin.DfpShift128.dst_lo);
5416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt shift;
5417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      shift =  i->Pin.DfpShift128.shift->Pri.Imm;
5419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* setup source operand in register 12, 13 pair */
5421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_src_hi, 72, 0);
5422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_src_lo, 72, 0);
5423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* execute instruction putting result in register 10, 11 pair */
5425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.DfpShift128.op) {
5426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DSCLIQ:    /* dscliq, DFP shift left, fr_srcR is the integer
5427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * shift amount.
5428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           */
5429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ22( p, 63, 10, 12, shift,  66, 0 );
5430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DSCRIQ:    /* dscriq, DFP shift right, fr_srcR is the integer
5432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           * shift amount.
5433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           */
5434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ22( p, 63, 10, 12, shift,  98, 0 );
5435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vex_printf("ERROR: emit_PPCInstr quad default case %d \n",
5438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    i->Pin.DfpShift128.op);
5439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction put the 128-bit result in registers (10,11).
5443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * Note, the operand in the instruction only reference the first of
5444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * the two registers in the pair.
5445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst_hi, 0, 10,  72, 0);
5447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst_lo, 0, 11,  72, 0);
5448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound: {
5452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst = fregNo(i->Pin.DfpRound.dst);
5453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src = fregNo(i->Pin.DfpRound.src);
5454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt r_rmc, r, rmc;
5455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      r_rmc =  i->Pin.DfpRound.r_rmc->Pri.Imm;
5457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      r = (r_rmc & 0x8) >> 3;
5458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      rmc = r_rmc & 0x3;
5459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // drintx
5461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormZ23(p, 59, fr_dst, r, fr_src, rmc, 99, 0);
5462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpRound128: {
5466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstHi = fregNo(i->Pin.DfpRound128.dst_hi);
5467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstLo = fregNo(i->Pin.DfpRound128.dst_lo);
5468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcHi = fregNo(i->Pin.DfpRound128.src_hi);
5469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcLo = fregNo(i->Pin.DfpRound128.src_lo);
5470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt r_rmc, r, rmc;
5471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      r_rmc =  i->Pin.DfpRound128.r_rmc->Pri.Imm;
5473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      r = (r_rmc & 0x8) >> 3;
5474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      rmc = r_rmc & 0x3;
5475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_srcHi, 72, 0);
5480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_srcLo, 72, 0);
5481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Do drintx instruction with 128-bit source operands in
5483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (12,13).
5484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormZ23(p, 63, 10, r, 12, rmc, 99, 0);
5486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 128-bit result in
5488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (10,11).  Note, the operand in the instruction only
5489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * reference the first of the two registers in the pair.
5490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize: {
5497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst  = fregNo(i->Pin.DfpQuantize.dst);
5498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcL = fregNo(i->Pin.DfpQuantize.srcL);
5499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcR = fregNo(i->Pin.DfpQuantize.srcR);
5500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt rmc;
5501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      rmc =  i->Pin.DfpQuantize.rmc->Pri.Imm;
5503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.DfpQuantize.op) {
5505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DQUA:
5506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ23(p, 59, fr_dst, fr_srcL, fr_srcR, rmc, 3, 0);
5507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_RRDTR:
5509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ23(p, 59, fr_dst, fr_srcL, fr_srcR, rmc, 35, 0);
5510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpQuantize128: {
5518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst_hi = fregNo(i->Pin.DfpQuantize128.dst_hi);
5519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst_lo = fregNo(i->Pin.DfpQuantize128.dst_lo);
5520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src_hi = fregNo(i->Pin.DfpQuantize128.src_hi);
5521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src_lo = fregNo(i->Pin.DfpQuantize128.src_lo);
5522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt rmc;
5523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      rmc =  i->Pin.DfpQuantize128.rmc->Pri.Imm;
5525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pairs.  Note, left source operand passed in via the
5527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * dst register pair.
5528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 10, 0, fr_dst_hi, 72, 0);
5530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 11, 0, fr_dst_lo, 72, 0);
5531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_src_hi, 72, 0);
5532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_src_lo, 72, 0);
5533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Do dquaq instruction with 128-bit source operands in
5535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (12,13).
5536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.DfpQuantize128.op) {
5538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DQUAQ:
5539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ23(p, 63, 10, 10, 12, rmc, 3, 0);
5540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DRRNDQ:
5542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormZ23(p, 63, 10, 10, 12, rmc, 35, 0);
5543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vpanic("Pin_DfpQuantize128: default case, couldn't find inst to issue \n");
5546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 128-bit result in
5550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (10,11).  Note, the operand in the instruction only
5551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * reference the first of the two registers in the pair.
5552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst_hi, 0, 10,  72, 0);
5554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst_lo, 0, 11,  72, 0);
5555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpD128toD64: {
5559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dst   = fregNo( i->Pin.DfpD128toD64.dst );
5560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcHi = fregNo( i->Pin.DfpD128toD64.src_hi );
5561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcLo = fregNo( i->Pin.DfpD128toD64.src_lo );
5562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 10, 0, fr_dst, 72, 0 );
5567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 12, 0, fr_srcHi, 72, 0 );
5568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX( p, 63, 13, 0, fr_srcLo, 72, 0 );
5569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Do instruction with 128-bit source operands in registers (10,11) */
5571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp128Binary.op) {
5572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DRDPQ:
5573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 0, 12, 770, 0 );
5574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCTFIXQ:
5576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 0, 12, 290, 0 );
5577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 64-bit result in registers 10. */
5583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dst, 0, 10,  72, 0);
5584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_DfpI64StoD128: {
5588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstHi = fregNo( i->Pin.DfpI64StoD128.dst_hi );
5589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstLo = fregNo( i->Pin.DfpI64StoD128.dst_lo );
5590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_src   = fregNo( i->Pin.DfpI64StoD128.src );
5591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (i->Pin.Dfp128Binary.op) {
5593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Pfp_DCFFIXQ:
5594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkFormX( p, 63, 10, 11, fr_src, 802, 0 );
5595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
5596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
5597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto bad;
5598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 64-bit result in registers 10, 11. */
5601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_InsertExpD128: {
5607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstHi  = fregNo(i->Pin.InsertExpD128.dst_hi);
5608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_dstLo  = fregNo(i->Pin.InsertExpD128.dst_lo);
5609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcL   = fregNo(i->Pin.InsertExpD128.srcL);
5610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcRHi = fregNo(i->Pin.InsertExpD128.srcR_hi);
5611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fr_srcRLo = fregNo(i->Pin.InsertExpD128.srcR_lo);
5612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The left operand is a single F64 value, the right is an F128
5614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 10, 0, fr_srcL, 72, 0);
5617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_srcRHi, 72, 0);
5618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_srcRLo, 72, 0);
5619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 10, 10, 12, 866, 0 );
5620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* The instruction will put the 128-bit result into
5622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * registers (10,11).  Note, the operand in the instruction only
5623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * reference the first of the two registers in the pair.
5624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstHi, 0, 10,  72, 0);
5626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, fr_dstLo, 0, 11,  72, 0);
5627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp64Cmp:{
5631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar crfD    = 1;
5632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  r_dst   = iregNo(i->Pin.Dfp64Cmp.dst, mode64);
5633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcL = fregNo(i->Pin.Dfp64Cmp.srcL);
5634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcR = fregNo(i->Pin.Dfp64Cmp.srcR);
5635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(crfD < 8);
5636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // dcmpo, dcmpu
5637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 59, crfD<<2, fr_srcL, fr_srcR, 130, 0);
5638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // mfcr (mv CR to r_dst)
5640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 31, r_dst, 0, 0, 19, 0);
5641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // rlwinm r_dst,r_dst,8,28,31
5643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      //  => rotate field 1 to bottomw of word, masking out upper 28
5644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0);
5645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_Dfp128Cmp: {
5649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar crfD       = 1;
5650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  r_dst      = iregNo(i->Pin.Dfp128Cmp.dst, mode64);
5651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcL_hi = fregNo(i->Pin.Dfp128Cmp.srcL_hi);
5652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcL_lo = fregNo(i->Pin.Dfp128Cmp.srcL_lo);
5653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcR_hi = fregNo(i->Pin.Dfp128Cmp.srcR_hi);
5654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt  fr_srcR_lo = fregNo(i->Pin.Dfp128Cmp.srcR_lo);
5655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(crfD < 8);
5656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // dcmpoq, dcmpuq
5657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Setup the upper and lower registers of the source operand
5658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       * register pair.
5659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       */
5660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 10, 0, fr_srcL_hi, 72, 0);
5661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 11, 0, fr_srcL_lo, 72, 0);
5662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 12, 0, fr_srcR_hi, 72, 0);
5663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, 13, 0, fr_srcR_lo, 72, 0);
5664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 63, crfD<<2, 10, 12, 130, 0);
5666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // mfcr (mv CR to r_dst)
5668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormX(p, 31, r_dst, 0, 0, 19, 0);
5669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // rlwinm r_dst,r_dst,8,28,31
5671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      //  => rotate field 1 to bottomw of word, masking out upper 28
5672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0);
5673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_EvCheck: {
5677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* This requires a 32-bit dec/test in both 32- and 64-bit
5678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         modes. */
5679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We generate:
5680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            lwz     r30, amCounter
5681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            addic.  r30, r30, -1
5682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            stw     r30, amCounter
5683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            bge     nofail
5684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            lwz/ld  r30, amFailAddr
5685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            mtctr   r30
5686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            bctr
5687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           nofail:
5688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      */
5689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UChar* p0 = p;
5690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* lwz r30, amCounter */
5691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_word32(p, True/*isLoad*/, /*r*/30,
5692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  i->Pin.EvCheck.amCounter, mode64);
5693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* addic. r30,r30,-1 */
5694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = emit32(p, 0x37DEFFFF);
5695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* stw r30, amCounter */
5696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_word32(p, False/*!isLoad*/, /*r*/30,
5697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  i->Pin.EvCheck.amCounter, mode64);
5698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bge nofail */
5699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = emit32(p, 0x40800010);
5700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* lwz/ld r30, amFailAddr */
5701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = do_load_or_store_machine_word(p, True/*isLoad*/, /*r*/30,
5702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        i->Pin.EvCheck.amFailAddr, mode64);
5703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* mtctr r30 */
5704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXFX(p, /*r*/30, 9, 467);
5705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* bctr */
5706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0);
5707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* nofail: */
5708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Crosscheck */
5710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(evCheckSzB_PPC() == (UChar*)p - (UChar*)p0);
5711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case Pin_ProfInc: {
5715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* We generate:
5716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               (ctrP is unknown now, so use 0x65556555(65556555) in the
5717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               expectation that a later call to LibVEX_patchProfCtr
5718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               will be used to fill in the immediate fields once the
5719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               right value is known.)
5720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            32-bit:
5721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              imm32-exactly r30, 0x65556555
5722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              lwz     r29, 4(r30)
5723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              addic.  r29, r29, 1
5724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              stw     r29, 4(r30)
5725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              lwz     r29, 0(r30)
5726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              addze   r29, r29
5727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              stw     r29, 0(r30)
5728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            64-bit:
5729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              imm64-exactly r30, 0x6555655565556555
5730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              ld      r29, 0(r30)
5731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              addi    r29, r29, 1
5732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              std     r29, 0(r30)
5733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      */
5734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (mode64) {
5735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkLoadImm_EXACTLY2or5(
5736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                p, /*r*/30, 0x6555655565556555ULL, True/*mode64*/);
5737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0xEBBE0000);
5738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x3BBD0001);
5739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0xFBBE0000);
5740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
5741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = mkLoadImm_EXACTLY2or5(
5742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                p, /*r*/30, 0x65556555ULL, False/*!mode64*/);
5743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x83BE0004);
5744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x37BD0001);
5745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x93BE0004);
5746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x83BE0000);
5747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x7FBD0194);
5748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         p = emit32(p, 0x93BE0000);
5749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
5750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Tell the caller .. */
5751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(!(*is_profInc));
5752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      *is_profInc = True;
5753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto done;
5754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   default:
5757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      goto bad;
5758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
5759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  bad:
5761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vex_printf("\n=> ");
5762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ppPPCInstr(i, mode64);
5763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   vpanic("emit_PPCInstr");
5764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*NOTREACHED*/
5765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  done:
5767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(p - &buf[0] <= 64);
5768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return p - &buf[0];
5769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
5770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check?  See case for Pin_EvCheck in
5773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   emit_PPCInstr just above.  That crosschecks what this returns, so
5774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   we can tell if we're inconsistent. */
5775663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt evCheckSzB_PPC ( void )
5776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  return 28;
5778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the
5782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   emitInstr case for XDirect, above. */
5783663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange chainXDirect_PPC ( void* place_to_chain,
5784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 void* disp_cp_chain_me_EXPECTED,
5785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 void* place_to_jump_to,
5786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 Bool  mode64 )
5787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* What we're expecting to see is:
5789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        imm32/64-fixed r30, disp_cp_chain_me_to_EXPECTED
5790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        mtctr r30
5791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        bctrl
5792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      viz
5793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5>
5794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        7F C9 03 A6
5795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        4E 80 04 21
5796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
5797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UChar* p = (UChar*)place_to_chain;
5798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(0 == (3 & (HWord)p));
5799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(isLoadImm_EXACTLY2or5(p, /*r*/30,
5800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 Ptr_to_ULong(disp_cp_chain_me_EXPECTED),
5801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 mode64));
5802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x7FC903A6);
5803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x4E800421);
5804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* And what we want to change it to is:
5805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        imm32/64-fixed r30, place_to_jump_to
5806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        mtctr r30
5807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        bctr
5808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      viz
5809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5>
5810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        7F C9 03 A6
5811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        4E 80 04 20
5812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      The replacement has the same length as the original.
5813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
5814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = mkLoadImm_EXACTLY2or5(p, /*r*/30,
5815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             Ptr_to_ULong(place_to_jump_to), mode64);
5816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = emit32(p, 0x7FC903A6);
5817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = emit32(p, 0x4E800420);
5818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int len = p - (UChar*)place_to_chain;
5820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(len == (mode64 ? 28 : 16)); /* stay sane */
5821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VexInvalRange vir = {(HWord)place_to_chain, len};
5822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return vir;
5823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the
5827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   emitInstr case for XDirect, above. */
5828663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange unchainXDirect_PPC ( void* place_to_unchain,
5829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   void* place_to_jump_to_EXPECTED,
5830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   void* disp_cp_chain_me,
5831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   Bool  mode64 )
5832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* What we're expecting to see is:
5834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        imm32/64-fixed r30, place_to_jump_to_EXPECTED
5835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        mtctr r30
5836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        bctr
5837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      viz
5838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5>
5839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        7F C9 03 A6
5840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        4E 80 04 20
5841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
5842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UChar* p = (UChar*)place_to_unchain;
5843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(0 == (3 & (HWord)p));
5844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(isLoadImm_EXACTLY2or5(p, /*r*/30,
5845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 Ptr_to_ULong(place_to_jump_to_EXPECTED),
5846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 mode64));
5847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x7FC903A6);
5848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x4E800420);
5849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* And what we want to change it to is:
5850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        imm32/64-fixed r30, disp_cp_chain_me
5851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        mtctr r30
5852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        bctrl
5853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      viz
5854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5>
5855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        7F C9 03 A6
5856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        4E 80 04 21
5857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      The replacement has the same length as the original.
5858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   */
5859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = mkLoadImm_EXACTLY2or5(p, /*r*/30,
5860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             Ptr_to_ULong(disp_cp_chain_me), mode64);
5861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = emit32(p, 0x7FC903A6);
5862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   p = emit32(p, 0x4E800421);
5863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int len = p - (UChar*)place_to_unchain;
5865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(len == (mode64 ? 28 : 16)); /* stay sane */
5866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VexInvalRange vir = {(HWord)place_to_unchain, len};
5867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return vir;
5868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter address into a profile inc point, as previously
5872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   created by the Pin_ProfInc case for emit_PPCInstr. */
5873663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange patchProfInc_PPC ( void*  place_to_patch,
5874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 ULong* location_of_counter,
5875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 Bool   mode64 )
5876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
5877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UChar* p = (UChar*)place_to_patch;
5878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(0 == (3 & (HWord)p));
5879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int len = 0;
5881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (mode64) {
5882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(isLoadImm_EXACTLY2or5(p, /*r*/30,
5883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    0x6555655565556555ULL, True/*mode64*/));
5884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 20) == 0xEBBE0000);
5885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 24) == 0x3BBD0001);
5886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 28) == 0xFBBE0000);
5887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm_EXACTLY2or5(p, /*r*/30,
5888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                Ptr_to_ULong(location_of_counter),
5889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                True/*mode64*/);
5890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      len = p - (UChar*)place_to_patch;
5891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(len == 20);
5892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
5893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(isLoadImm_EXACTLY2or5(p, /*r*/30,
5894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    0x65556555ULL, False/*!mode64*/));
5895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p +  8) == 0x83BE0004);
5896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 12) == 0x37BD0001);
5897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 16) == 0x93BE0004);
5898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 20) == 0x83BE0000);
5899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 24) == 0x7FBD0194);
5900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(fetch32(p + 28) == 0x93BE0000);
5901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = mkLoadImm_EXACTLY2or5(p, /*r*/30,
5902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                Ptr_to_ULong(location_of_counter),
5903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                False/*!mode64*/);
5904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      len = p - (UChar*)place_to_patch;
5905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(len == 8);
5906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
5907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   VexInvalRange vir = {(HWord)place_to_patch, len};
5908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return vir;
5909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
5910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
5913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                     host_ppc_defs.c ---*/
5914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
5915