1bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
2bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion/*---------------------------------------------------------------*/
3752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--- begin                                   host_ppc_defs.h ---*/
4bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion/*---------------------------------------------------------------*/
5bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
6bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion/*
7752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This file is part of Valgrind, a dynamic binary instrumentation
8752f90673ebbb6b2f55fc5e46606dea371313713sewardj   framework.
9bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
1089ae8477745fd2a15453557d729a50e627325ee2sewardj   Copyright (C) 2004-2013 OpenWorks LLP
11752f90673ebbb6b2f55fc5e46606dea371313713sewardj      info@open-works.net
127bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
13752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is free software; you can redistribute it and/or
14752f90673ebbb6b2f55fc5e46606dea371313713sewardj   modify it under the terms of the GNU General Public License as
15752f90673ebbb6b2f55fc5e46606dea371313713sewardj   published by the Free Software Foundation; either version 2 of the
16752f90673ebbb6b2f55fc5e46606dea371313713sewardj   License, or (at your option) any later version.
177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
18752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is distributed in the hope that it will be useful, but
19752f90673ebbb6b2f55fc5e46606dea371313713sewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
20752f90673ebbb6b2f55fc5e46606dea371313713sewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21752f90673ebbb6b2f55fc5e46606dea371313713sewardj   General Public License for more details.
22752f90673ebbb6b2f55fc5e46606dea371313713sewardj
23752f90673ebbb6b2f55fc5e46606dea371313713sewardj   You should have received a copy of the GNU General Public License
24752f90673ebbb6b2f55fc5e46606dea371313713sewardj   along with this program; if not, write to the Free Software
25752f90673ebbb6b2f55fc5e46606dea371313713sewardj   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   02110-1301, USA.
277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
28752f90673ebbb6b2f55fc5e46606dea371313713sewardj   The GNU General Public License is contained in the file COPYING.
29bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
30bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   Neither the names of the U.S. Department of Energy nor the
31bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   University of California nor the names of its contributors may be
32bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   used to endorse or promote products derived from this software
33bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   without prior written permission.
34bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion*/
35bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
36cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#ifndef __VEX_HOST_PPC_DEFS_H
37cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#define __VEX_HOST_PPC_DEFS_H
38bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
3958a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "libvex_basictypes.h"
4058a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "libvex.h"                      // VexArch
4158a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "host_generic_regs.h"           // HReg
4258a637b6675d4d68e13d18b75cea7eee2a2a91feflorian
43bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
44bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion/* --------- Registers. --------- */
45bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
46a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define ST_IN static inline
47a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
48a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define GPR(_mode64, _enc, _ix64, _ix32) \
49a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj  mkHReg(False,  (_mode64) ? HRcInt64 : HRcInt32, \
50a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         (_enc), (_mode64) ? (_ix64) : (_ix32))
51a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
52a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define FPR(_mode64, _enc, _ix64, _ix32) \
53a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj  mkHReg(False,  HRcFlt64, \
54a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         (_enc), (_mode64) ? (_ix64) : (_ix32))
55a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
56a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define VR(_mode64, _enc, _ix64, _ix32) \
57a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj  mkHReg(False,  HRcVec128, \
58a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj         (_enc), (_mode64) ? (_ix64) : (_ix32))
59a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
60a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR3  ( Bool mode64 ) { return GPR(mode64,  3,   0,  0); }
61a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR4  ( Bool mode64 ) { return GPR(mode64,  4,   1,  1); }
62a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR5  ( Bool mode64 ) { return GPR(mode64,  5,   2,  2); }
63a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR6  ( Bool mode64 ) { return GPR(mode64,  6,   3,  3); }
64a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR7  ( Bool mode64 ) { return GPR(mode64,  7,   4,  4); }
65a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR8  ( Bool mode64 ) { return GPR(mode64,  8,   5,  5); }
66a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR9  ( Bool mode64 ) { return GPR(mode64,  9,   6,  6); }
67a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR10 ( Bool mode64 ) { return GPR(mode64, 10,   7,  7); }
68a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
69a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj// r11 and r12 are only allocatable in 32-bit mode.  Hence the 64-bit
70a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj// index numbering doesn't advance for these two.
71a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR11 ( Bool mode64 ) { return GPR(mode64, 11,   0,  8); }
72a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR12 ( Bool mode64 ) { return GPR(mode64, 12,   0,  9); }
73a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
74a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR14 ( Bool mode64 ) { return GPR(mode64, 14,   8, 10); }
75a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR15 ( Bool mode64 ) { return GPR(mode64, 15,   9, 11); }
76a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR16 ( Bool mode64 ) { return GPR(mode64, 16,  10, 12); }
77a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR17 ( Bool mode64 ) { return GPR(mode64, 17,  11, 13); }
78a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR18 ( Bool mode64 ) { return GPR(mode64, 18,  12, 14); }
79a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR19 ( Bool mode64 ) { return GPR(mode64, 19,  13, 15); }
80a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR20 ( Bool mode64 ) { return GPR(mode64, 20,  14, 16); }
81a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR21 ( Bool mode64 ) { return GPR(mode64, 21,  15, 17); }
82a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR22 ( Bool mode64 ) { return GPR(mode64, 22,  16, 18); }
83a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR23 ( Bool mode64 ) { return GPR(mode64, 23,  17, 19); }
84a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR24 ( Bool mode64 ) { return GPR(mode64, 24,  18, 20); }
85a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR25 ( Bool mode64 ) { return GPR(mode64, 25,  19, 21); }
86a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR26 ( Bool mode64 ) { return GPR(mode64, 26,  20, 22); }
87a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR27 ( Bool mode64 ) { return GPR(mode64, 27,  21, 23); }
88a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR28 ( Bool mode64 ) { return GPR(mode64, 28,  22, 24); }
89a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
90a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_FPR14 ( Bool mode64 ) { return FPR(mode64, 14,  23, 25); }
91a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_FPR15 ( Bool mode64 ) { return FPR(mode64, 15,  24, 26); }
92a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_FPR16 ( Bool mode64 ) { return FPR(mode64, 16,  25, 27); }
93a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_FPR17 ( Bool mode64 ) { return FPR(mode64, 17,  26, 28); }
94a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_FPR18 ( Bool mode64 ) { return FPR(mode64, 18,  27, 29); }
95a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_FPR19 ( Bool mode64 ) { return FPR(mode64, 19,  28, 30); }
96a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_FPR20 ( Bool mode64 ) { return FPR(mode64, 20,  29, 31); }
97a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_FPR21 ( Bool mode64 ) { return FPR(mode64, 21,  30, 32); }
98a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
99a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_VR20  ( Bool mode64 ) { return VR (mode64, 20,  31, 33); }
100a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_VR21  ( Bool mode64 ) { return VR (mode64, 21,  32, 34); }
101a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_VR22  ( Bool mode64 ) { return VR (mode64, 22,  33, 35); }
102a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_VR23  ( Bool mode64 ) { return VR (mode64, 23,  34, 36); }
103a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_VR24  ( Bool mode64 ) { return VR (mode64, 24,  35, 37); }
104a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_VR25  ( Bool mode64 ) { return VR (mode64, 25,  36, 38); }
105a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_VR26  ( Bool mode64 ) { return VR (mode64, 26,  37, 39); }
106a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_VR27  ( Bool mode64 ) { return VR (mode64, 27,  38, 40); }
107a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
108a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR1  ( Bool mode64 ) { return GPR(mode64,  1,  39, 41); }
109a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR29 ( Bool mode64 ) { return GPR(mode64, 29,  40, 42); }
110a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR30 ( Bool mode64 ) { return GPR(mode64, 30,  41, 43); }
111a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_GPR31 ( Bool mode64 ) { return GPR(mode64, 31,  42, 44); }
112a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregPPC_VR29  ( Bool mode64 ) { return VR (mode64, 29,  43, 45); }
113a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
114a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#undef ST_IN
115a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#undef GPR
116a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#undef FPR
117a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#undef VR
118bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
119f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion#define StackFramePtr(_mode64) hregPPC_GPR1(_mode64)
120f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion#define GuestStatePtr(_mode64) hregPPC_GPR31(_mode64)
121bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
122a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj/* Num registers used for function calls */
123a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define PPC_N_REGPARMS 8
124a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
125a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjextern void ppHRegPPC ( HReg );
1262c49e036c365df707cd8e6622d66382f380557b2cerion
1272c49e036c365df707cd8e6622d66382f380557b2cerion
128b51f0f4f33256638ed953156a2635aa739b232f1sewardj/* --------- Condition codes --------- */
1292c49e036c365df707cd8e6622d66382f380557b2cerion
130b51f0f4f33256638ed953156a2635aa739b232f1sewardj/* This gives names from bitfields in CR; hence it names BI numbers */
131b51f0f4f33256638ed953156a2635aa739b232f1sewardj/* Using IBM/hardware indexing convention */
132ab9132df645da753ae6b0421d551ea5c024aa6e6ceriontypedef
133b51f0f4f33256638ed953156a2635aa739b232f1sewardj   enum {
134b51f0f4f33256638ed953156a2635aa739b232f1sewardj      // CR7, which we use for integer compares
135b51f0f4f33256638ed953156a2635aa739b232f1sewardj      Pcf_7LT  = 28,  /* neg  | lt          */
136b51f0f4f33256638ed953156a2635aa739b232f1sewardj      Pcf_7GT  = 29,  /* pos  | gt          */
137b51f0f4f33256638ed953156a2635aa739b232f1sewardj      Pcf_7EQ  = 30,  /* zero | equal       */
1387e3080762e559bb58213654a7be8cbb529e40446sewardj      Pcf_7SO  = 31,  /* summary overflow   */
1397e3080762e559bb58213654a7be8cbb529e40446sewardj      Pcf_NONE = 32   /* no condition; used with Pct_ALWAYS */
140ab9132df645da753ae6b0421d551ea5c024aa6e6cerion   }
1415b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCCondFlag;
1422c49e036c365df707cd8e6622d66382f380557b2cerion
143ab9132df645da753ae6b0421d551ea5c024aa6e6ceriontypedef
1447cf8e4e86f4d055ccb2d0c681c76100960a8e235cerion   enum {   /* Maps bc bitfield BO */
1457e3080762e559bb58213654a7be8cbb529e40446sewardj      Pct_FALSE  = 0x4, /* associated PPCCondFlag must not be Pcf_NONE */
1467e3080762e559bb58213654a7be8cbb529e40446sewardj      Pct_TRUE   = 0xC, /* associated PPCCondFlag must not be Pcf_NONE */
1477e3080762e559bb58213654a7be8cbb529e40446sewardj      Pct_ALWAYS = 0x14 /* associated PPCCondFlag must be Pcf_NONE */
148ab9132df645da753ae6b0421d551ea5c024aa6e6cerion   }
1495b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCCondTest;
1502c49e036c365df707cd8e6622d66382f380557b2cerion
151ab9132df645da753ae6b0421d551ea5c024aa6e6ceriontypedef
152ab9132df645da753ae6b0421d551ea5c024aa6e6cerion   struct {
1535b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      PPCCondFlag flag;
1545b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      PPCCondTest test;
1552c49e036c365df707cd8e6622d66382f380557b2cerion   }
1565b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCCondCode;
1572c49e036c365df707cd8e6622d66382f380557b2cerion
15855085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showPPCCondCode ( PPCCondCode );
159bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
1607cf8e4e86f4d055ccb2d0c681c76100960a8e235cerion/* constructor */
1615b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCCondCode mk_PPCCondCode ( PPCCondTest, PPCCondFlag );
1627cf8e4e86f4d055ccb2d0c681c76100960a8e235cerion
1637cf8e4e86f4d055ccb2d0c681c76100960a8e235cerion/* false->true, true->false */
1645b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCCondTest invertCondTest ( PPCCondTest );
165bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
166ab9132df645da753ae6b0421d551ea5c024aa6e6cerion
167ab9132df645da753ae6b0421d551ea5c024aa6e6cerion
16833aa6da1102a12139debec996c33e4effa16f77ccerion
169bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion/* --------- Memory address expressions (amodes). --------- */
170bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
171bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fceriontypedef
172bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   enum {
17392923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj     Pam_IR=1,      /* Immediate (signed 16-bit) + Reg */
17492923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj     Pam_RR=2       /* Reg1 + Reg2     */
175bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   }
1765b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCAModeTag;
177bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
178bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fceriontypedef
179bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   struct {
1805b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      PPCAModeTag tag;
181bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion      union {
182bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion         struct {
183bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion            HReg base;
184a5f957df568527d44219383f4a04a8f4028b80a2sewardj            Int  index;
185bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion         } IR;
186bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion         struct {
187bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion            HReg base;
188bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion            HReg index;
189bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion         } RR;
190bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion      } Pam;
191bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   }
1925b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCAMode;
193bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
1945b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCAMode* PPCAMode_IR ( Int,  HReg );
1955b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCAMode* PPCAMode_RR ( HReg, HReg );
196bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
1975b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCAMode* dopyPPCAMode ( PPCAMode* );
198bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
1995b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern void ppPPCAMode ( PPCAMode* );
200bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
201bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
202b51f0f4f33256638ed953156a2635aa739b232f1sewardj/* --------- Operand, which can be a reg or a u16/s16. --------- */
203b51f0f4f33256638ed953156a2635aa739b232f1sewardj/* ("RH" == "Register or Halfword immediate") */
204bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fceriontypedef
205bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   enum {
20692923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj      Prh_Imm=3,
20792923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj      Prh_Reg=4
208bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   }
2095b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCRHTag;
210bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
211bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fceriontypedef
212bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   struct {
2135b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      PPCRHTag tag;
214bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion      union {
215bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion         struct {
216b51f0f4f33256638ed953156a2635aa739b232f1sewardj            Bool   syned;
217b51f0f4f33256638ed953156a2635aa739b232f1sewardj            UShort imm16;
218bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion         } Imm;
219bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion         struct {
220bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion            HReg reg;
221bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion         } Reg;
222bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion      }
223b51f0f4f33256638ed953156a2635aa739b232f1sewardj      Prh;
224b51f0f4f33256638ed953156a2635aa739b232f1sewardj   }
2255b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCRH;
226b51f0f4f33256638ed953156a2635aa739b232f1sewardj
2275b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCRH* PPCRH_Imm ( Bool, UShort );
2285b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCRH* PPCRH_Reg ( HReg );
229b51f0f4f33256638ed953156a2635aa739b232f1sewardj
2305b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern void ppPPCRH ( PPCRH* );
231b51f0f4f33256638ed953156a2635aa739b232f1sewardj
232b51f0f4f33256638ed953156a2635aa739b232f1sewardj
233f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion/* --------- Operand, which can be a reg or a u32/64. --------- */
234b51f0f4f33256638ed953156a2635aa739b232f1sewardj
235b51f0f4f33256638ed953156a2635aa739b232f1sewardjtypedef
236b51f0f4f33256638ed953156a2635aa739b232f1sewardj   enum {
23792923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj      Pri_Imm=5,
23892923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj      Pri_Reg=6
239b51f0f4f33256638ed953156a2635aa739b232f1sewardj   }
2405b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCRITag;
241b51f0f4f33256638ed953156a2635aa739b232f1sewardj
242b51f0f4f33256638ed953156a2635aa739b232f1sewardjtypedef
243b51f0f4f33256638ed953156a2635aa739b232f1sewardj   struct {
2445b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      PPCRITag tag;
245b51f0f4f33256638ed953156a2635aa739b232f1sewardj      union {
246f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         ULong Imm;
247f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         HReg  Reg;
248b51f0f4f33256638ed953156a2635aa739b232f1sewardj      }
249bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion      Pri;
250bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   }
2515b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCRI;
252bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
2535b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCRI* PPCRI_Imm ( ULong );
254478646f54befaba01cbceb40fd5e46cdf562fdb5sewardjextern PPCRI* PPCRI_Reg( HReg );
255bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
2565b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern void ppPPCRI ( PPCRI* );
257bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
258bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
25927b3d7ec17c3a0814d4980db87defbb4f07339bfcerion/* --------- Operand, which can be a vector reg or a s6. --------- */
26027b3d7ec17c3a0814d4980db87defbb4f07339bfcerion/* ("VI" == "Vector Register or Immediate") */
26127b3d7ec17c3a0814d4980db87defbb4f07339bfceriontypedef
26227b3d7ec17c3a0814d4980db87defbb4f07339bfcerion   enum {
26392923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj      Pvi_Imm=7,
26492923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj      Pvi_Reg=8
26527b3d7ec17c3a0814d4980db87defbb4f07339bfcerion   }
2665b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCVI5sTag;
26727b3d7ec17c3a0814d4980db87defbb4f07339bfcerion
26827b3d7ec17c3a0814d4980db87defbb4f07339bfceriontypedef
26927b3d7ec17c3a0814d4980db87defbb4f07339bfcerion   struct {
2705b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      PPCVI5sTag tag;
27127b3d7ec17c3a0814d4980db87defbb4f07339bfcerion      union {
27227b3d7ec17c3a0814d4980db87defbb4f07339bfcerion         Char Imm5s;
27327b3d7ec17c3a0814d4980db87defbb4f07339bfcerion         HReg Reg;
27427b3d7ec17c3a0814d4980db87defbb4f07339bfcerion      }
27527b3d7ec17c3a0814d4980db87defbb4f07339bfcerion      Pvi;
27627b3d7ec17c3a0814d4980db87defbb4f07339bfcerion   }
2775b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCVI5s;
27827b3d7ec17c3a0814d4980db87defbb4f07339bfcerion
2795b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCVI5s* PPCVI5s_Imm ( Char );
2805b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCVI5s* PPCVI5s_Reg ( HReg );
28127b3d7ec17c3a0814d4980db87defbb4f07339bfcerion
2825b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern void ppPPCVI5s ( PPCVI5s* );
28327b3d7ec17c3a0814d4980db87defbb4f07339bfcerion
28427b3d7ec17c3a0814d4980db87defbb4f07339bfcerion
285cd304497d9d869f9b24a002299d3953ee072229bcerion/* --------- Instructions. --------- */
286bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
2872c49e036c365df707cd8e6622d66382f380557b2cerion/* --------- */
2882c49e036c365df707cd8e6622d66382f380557b2ceriontypedef
2892c49e036c365df707cd8e6622d66382f380557b2cerion   enum {
2902c49e036c365df707cd8e6622d66382f380557b2cerion      Pun_NEG,
291e13bb31f40567937f05190474ec2cad3b7e22240cerion      Pun_NOT,
29207b07a966a2fdbcf621251a0c1a8ab84807fb120cerion      Pun_CLZ32,
2937fd5bb0dd6e9b745f8f8452f15cebb3c628d0a22sewardj      Pun_CLZ64,
2947fd5bb0dd6e9b745f8f8452f15cebb3c628d0a22sewardj      Pun_EXTSW
2952c49e036c365df707cd8e6622d66382f380557b2cerion   }
2965b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCUnaryOp;
2972c49e036c365df707cd8e6622d66382f380557b2cerion
29855085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showPPCUnaryOp ( PPCUnaryOp );
299cd304497d9d869f9b24a002299d3953ee072229bcerion
300cd304497d9d869f9b24a002299d3953ee072229bcerion
301cd304497d9d869f9b24a002299d3953ee072229bcerion/* --------- */
302cd304497d9d869f9b24a002299d3953ee072229bceriontypedef
303cd304497d9d869f9b24a002299d3953ee072229bcerion   enum {
304cd304497d9d869f9b24a002299d3953ee072229bcerion      Palu_INVALID,
305b51f0f4f33256638ed953156a2635aa739b232f1sewardj      Palu_ADD, Palu_SUB,
306b51f0f4f33256638ed953156a2635aa739b232f1sewardj      Palu_AND, Palu_OR, Palu_XOR,
307cd304497d9d869f9b24a002299d3953ee072229bcerion   }
3085b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCAluOp;
309cd304497d9d869f9b24a002299d3953ee072229bcerion
310b51f0f4f33256638ed953156a2635aa739b232f1sewardjextern
31155085f8680acc89d727e321f3b34cae1a8c4093aflorianconst HChar* showPPCAluOp ( PPCAluOp,
31255085f8680acc89d727e321f3b34cae1a8c4093aflorian                            Bool /* is the 2nd operand an immediate? */);
313bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion
314bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion
315bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion/* --------- */
316bb01b7cbfd84c27dd213f67a144ea5a99af36961ceriontypedef
317bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion   enum {
318bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion      Pshft_INVALID,
319bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion      Pshft_SHL, Pshft_SHR, Pshft_SAR,
320bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion   }
3215b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCShftOp;
322bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion
323bb01b7cbfd84c27dd213f67a144ea5a99af36961cerionextern
32455085f8680acc89d727e321f3b34cae1a8c4093aflorianconst HChar* showPPCShftOp ( PPCShftOp,
32555085f8680acc89d727e321f3b34cae1a8c4093aflorian                             Bool /* is the 2nd operand an immediate? */,
32655085f8680acc89d727e321f3b34cae1a8c4093aflorian                             Bool /* is this a 32bit or 64bit op? */ );
327ab9132df645da753ae6b0421d551ea5c024aa6e6cerion
328ab9132df645da753ae6b0421d551ea5c024aa6e6cerion
329094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion/* --------- */
330094d1397b3f69b1a538e80ab509ea8cd75f4be3bceriontypedef
331094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion   enum {
332094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion      Pfp_INVALID,
33340c802659108a96bb87cbc1a30b7b77e2abd0829sewardj
33440c802659108a96bb87cbc1a30b7b77e2abd0829sewardj      /* Ternary */
335c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pfp_MADDD,  Pfp_MSUBD,
336c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pfp_MADDS,  Pfp_MSUBS,
337c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pfp_DFPADD, Pfp_DFPADDQ,
338c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pfp_DFPSUB, Pfp_DFPSUBQ,
339c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pfp_DFPMUL, Pfp_DFPMULQ,
340c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pfp_DFPDIV, Pfp_DFPDIVQ,
341c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pfp_DQUAQ,  Pfp_DRRNDQ,
34240c802659108a96bb87cbc1a30b7b77e2abd0829sewardj
343094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion      /* Binary */
34426217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj      Pfp_ADDD, Pfp_SUBD, Pfp_MULD, Pfp_DIVD,
34526217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj      Pfp_ADDS, Pfp_SUBS, Pfp_MULS, Pfp_DIVS,
346cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pfp_DRSP, Pfp_DRDPQ, Pfp_DCTFIX, Pfp_DCTFIXQ, Pfp_DCFFIX,
347cea07ccbe9aa9b5fd8e9b318471c6c74aa147acbcarll      Pfp_DQUA, Pfp_RRDTR, Pfp_DIEX, Pfp_DIEXQ, Pfp_DRINTN,
348094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion
349094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion      /* Unary */
3500f1ef86a99d5129e04ed188e44d16a344d2bc42asewardj      Pfp_SQRT, Pfp_ABS, Pfp_NEG, Pfp_MOV, Pfp_RES, Pfp_RSQRTE,
35126217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj      Pfp_FRIN, Pfp_FRIM, Pfp_FRIP, Pfp_FRIZ,
352cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pfp_DSCLI, Pfp_DSCRI, Pfp_DSCLIQ, Pfp_DSCRIQ, Pfp_DCTDP,
353cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pfp_DCTQPQ, Pfp_DCFFIXQ, Pfp_DXEX, Pfp_DXEXQ,
354cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj
355094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion   }
3565b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCFpOp;
357094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion
35855085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showPPCFpOp ( PPCFpOp );
359bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
360bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
361bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion/* --------- */
362bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fceriontypedef
363bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   enum {
364c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pav_INVALID,
365c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
366c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      /* Integer Unary */
367c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pav_MOV,                             /* Mov */
368c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pav_NOT,                             /* Bitwise */
369c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pav_UNPCKH8S,  Pav_UNPCKH16S,        /* Unpack */
370c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pav_UNPCKL8S,  Pav_UNPCKL16S,
371c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pav_UNPCKHPIX, Pav_UNPCKLPIX,
372c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
373c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      /* Integer Binary */
3748ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion      Pav_AND, Pav_OR, Pav_XOR,            /* Bitwise */
375f34ccc4ae06b8de99583c836fc15a571567b363acerion      Pav_ADDU, Pav_QADDU, Pav_QADDS,
376f34ccc4ae06b8de99583c836fc15a571567b363acerion      Pav_SUBU, Pav_QSUBU, Pav_QSUBS,
37748ae46b56cef87c90638b25d6b2462c475033da8carll      Pav_MULU,
3786b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pav_OMULU, Pav_OMULS, Pav_EMULU, Pav_EMULS,
3796b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pav_AVGU, Pav_AVGS,
3806b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pav_MAXU, Pav_MAXS,
3816b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pav_MINU, Pav_MINS,
382c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
383c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      /* Compare (always affects CR field 6) */
3846b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pav_CMPEQU, Pav_CMPGTU, Pav_CMPGTS,
385c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
386c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      /* Shift */
3876b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pav_SHL, Pav_SHR, Pav_SAR, Pav_ROTL,
388c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
389c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      /* Pack */
390f34ccc4ae06b8de99583c836fc15a571567b363acerion      Pav_PACKUU, Pav_QPACKUU, Pav_QPACKSU, Pav_QPACKSS,
3916b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pav_PACKPXL,
392c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
393c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      /* Merge */
3946b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pav_MRGHI, Pav_MRGLO,
39548ae46b56cef87c90638b25d6b2462c475033da8carll
39648ae46b56cef87c90638b25d6b2462c475033da8carll      /* Concatenation */
39748ae46b56cef87c90638b25d6b2462c475033da8carll      Pav_CATODD, Pav_CATEVEN,
3987deaf9552b546b847528cf39b38898fb7742b5f5carll
3997deaf9552b546b847528cf39b38898fb7742b5f5carll      /* Polynomial Multipy-Add */
4007deaf9552b546b847528cf39b38898fb7742b5f5carll      Pav_POLYMULADD,
4017deaf9552b546b847528cf39b38898fb7742b5f5carll
4027deaf9552b546b847528cf39b38898fb7742b5f5carll      /* Cipher */
4037deaf9552b546b847528cf39b38898fb7742b5f5carll      Pav_CIPHERV128, Pav_CIPHERLV128, Pav_NCIPHERV128, Pav_NCIPHERLV128,
4047deaf9552b546b847528cf39b38898fb7742b5f5carll      Pav_CIPHERSUBV128,
4057deaf9552b546b847528cf39b38898fb7742b5f5carll
4067deaf9552b546b847528cf39b38898fb7742b5f5carll      /* Hash */
4077deaf9552b546b847528cf39b38898fb7742b5f5carll      Pav_SHA256, Pav_SHA512,
4087deaf9552b546b847528cf39b38898fb7742b5f5carll
4097deaf9552b546b847528cf39b38898fb7742b5f5carll      /* BCD Arithmetic */
4107deaf9552b546b847528cf39b38898fb7742b5f5carll      Pav_BCDAdd, Pav_BCDSub,
4117deaf9552b546b847528cf39b38898fb7742b5f5carll
4127deaf9552b546b847528cf39b38898fb7742b5f5carll      /* zero count */
4137deaf9552b546b847528cf39b38898fb7742b5f5carll      Pav_ZEROCNTBYTE, Pav_ZEROCNTWORD, Pav_ZEROCNTHALF, Pav_ZEROCNTDBL,
41460c6bac19ffe055cabab554e7877d73096a8bf17carll
41560c6bac19ffe055cabab554e7877d73096a8bf17carll      /* Vector bit matrix transpose by byte */
41660c6bac19ffe055cabab554e7877d73096a8bf17carll      Pav_BITMTXXPOSE,
4178ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion   }
4185b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCAvOp;
4198ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion
42055085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showPPCAvOp ( PPCAvOp );
4218ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion
4228ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion
4238ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion/* --------- */
4248ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686ceriontypedef
4258ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion   enum {
4268ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion      Pavfp_INVALID,
4276b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion
4286b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      /* Floating point binary */
4298ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion      Pavfp_ADDF, Pavfp_SUBF, Pavfp_MULF,
4308ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion      Pavfp_MAXF, Pavfp_MINF,
4318ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion      Pavfp_CMPEQF, Pavfp_CMPGTF, Pavfp_CMPGEF,
4326b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion
4338ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion      /* Floating point unary */
4348ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion      Pavfp_RCPF, Pavfp_RSQRTF,
435d963eb444d05fe1ef210a729ff056e28c330f120cerion      Pavfp_CVTU2F, Pavfp_CVTS2F, Pavfp_QCVTF2U, Pavfp_QCVTF2S,
436d963eb444d05fe1ef210a729ff056e28c330f120cerion      Pavfp_ROUNDM, Pavfp_ROUNDP, Pavfp_ROUNDN, Pavfp_ROUNDZ,
437c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion   }
4385b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCAvFpOp;
439c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
44055085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar* showPPCAvFpOp ( PPCAvFpOp );
441c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
442c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
443c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion/* --------- */
444c3d8bdcb51893e6d23ab9b27122741208a044cf1ceriontypedef
445c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion   enum {
446f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      Pin_LI,         /* load word (32/64-bit) immediate (fake insn) */
447bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion      Pin_Alu,        /* word add/sub/and/or/xor */
448bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion      Pin_Shft,       /* word shl/shr/sar */
4495b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      Pin_AddSubC,    /* add/sub with read/write carry */
450f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      Pin_Cmp,        /* word compare */
451f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      Pin_Unary,      /* not, neg, clz */
452ed623dbefb52ca3211490d656abc999a129df060cerion      Pin_MulL,       /* widening multiply */
453ed623dbefb52ca3211490d656abc999a129df060cerion      Pin_Div,        /* div */
454ed623dbefb52ca3211490d656abc999a129df060cerion      Pin_Call,       /* call to address in register */
4553dee849ec7c38746749065e67dc53b75daa7617dsewardj      Pin_XDirect,    /* direct transfer to GA */
4563dee849ec7c38746749065e67dc53b75daa7617dsewardj      Pin_XIndir,     /* indirect transfer to GA */
4573dee849ec7c38746749065e67dc53b75daa7617dsewardj      Pin_XAssisted,  /* assisted transfer to GA */
458f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      Pin_CMov,       /* conditional move */
4597fd5bb0dd6e9b745f8f8452f15cebb3c628d0a22sewardj      Pin_Load,       /* zero-extending load a 8|16|32|64 bit value from mem */
460e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj      Pin_LoadL,      /* load-linked (lwarx/ldarx) 32|64 bit value from mem */
4615b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      Pin_Store,      /* store a 8|16|32|64 bit value to mem */
462e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj      Pin_StoreC,     /* store-conditional (stwcx./stdcx.) 32|64 bit val */
4635b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      Pin_Set,        /* convert condition code to value 0 or 1 */
464b51f0f4f33256638ed953156a2635aa739b232f1sewardj      Pin_MfCR,       /* move from condition register to GPR */
465b51f0f4f33256638ed953156a2635aa739b232f1sewardj      Pin_MFence,     /* mem fence */
466c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
467094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion      Pin_FpUnary,    /* FP unary op */
468094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion      Pin_FpBinary,   /* FP binary op */
46940c802659108a96bb87cbc1a30b7b77e2abd0829sewardj      Pin_FpMulAcc,   /* FP multipy-accumulate style op */
470094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion      Pin_FpLdSt,     /* FP load/store */
47192923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj      Pin_FpSTFIW,    /* stfiwx */
47292923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj      Pin_FpRSP,      /* FP round IEEE754 double to IEEE754 single */
4737d810d793616af057ce861746aa985df3304cb86sewardj      Pin_FpCftI,     /* fcfid[u,s,us]/fctid[u]/fctiw[u] */
474094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion      Pin_FpCMov,     /* FP floating point conditional move */
475094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion      Pin_FpLdFPSCR,  /* mtfsf */
476094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion      Pin_FpCmp,      /* FP compare, generating value into int reg */
47792923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj
478c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pin_RdWrLR,     /* Read/Write Link Register */
479c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
480c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pin_AvLdSt,     /* AV load/store (kludging for AMode_IR) */
481c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pin_AvUnary,    /* AV unary general reg=>reg */
4826b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion
483c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pin_AvBinary,   /* AV binary general reg,reg=>reg */
4846b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pin_AvBin8x16,  /* AV binary, 8x4 */
4856b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pin_AvBin16x8,  /* AV binary, 16x4 */
4866b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pin_AvBin32x4,  /* AV binary, 32x4 */
4870c74bb5aa3240f693df0568d578baabf0c376dc4carll      Pin_AvBin64x2,  /* AV binary, 64x2 */
4886b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion
4896b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pin_AvBin32Fx4, /* AV FP binary, 32Fx4 */
4908ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion      Pin_AvUn32Fx4,  /* AV FP unary,  32Fx4 */
491c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
492c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pin_AvPerm,     /* AV permute (shuffle) */
493c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pin_AvSel,      /* AV select */
4949877fe5792c32f04fa31018a72928903031a12e8carll      Pin_AvSh,       /* AV shift left or right */
495c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pin_AvShlDbl,   /* AV shift-left double by imm */
496c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion      Pin_AvSplat,    /* One elem repeated throughout dst */
4976b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion      Pin_AvLdVSCR,   /* mtvscr */
498c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pin_AvCMov,     /* AV conditional move */
4997deaf9552b546b847528cf39b38898fb7742b5f5carll      Pin_AvCipherV128Unary,  /* AV Vector unary Cipher */
5007deaf9552b546b847528cf39b38898fb7742b5f5carll      Pin_AvCipherV128Binary, /* AV Vector binary Cipher */
5017deaf9552b546b847528cf39b38898fb7742b5f5carll      Pin_AvHashV128Binary, /* AV Vector binary Hash */
5027deaf9552b546b847528cf39b38898fb7742b5f5carll      Pin_AvBCDV128Trinary, /* BCD Arithmetic */
503c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pin_Dfp64Unary,   /* DFP64  unary op */
50426217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj      Pin_Dfp128Unary,  /* DFP128 unary op */
50526217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj      Pin_DfpShift,     /* Decimal floating point shift by immediate value */
506c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      Pin_Dfp64Binary,  /* DFP64  binary op */
50726217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj      Pin_Dfp128Binary, /* DFP128 binary op */
50826217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj      Pin_DfpShift128,  /* 128-bit Decimal floating point shift by
50926217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj                         * immediate value */
51026217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj      Pin_DfpD128toD64, /* DFP 128 to DFP 64 op */
51126217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj      Pin_DfpI64StoD128, /* DFP signed integer to DFP 128 */
512cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pin_DfpRound,       /* D64 round to D64 */
513cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pin_DfpRound128,    /* D128 round to D128 */
514cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pin_ExtractExpD128, /* DFP, extract 64 bit exponent */
515cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pin_InsertExpD128,  /* DFP, insert 64 bit exponent and 128 bit binary
516cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                           * significand into a DFP 128-bit value*/
517cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pin_Dfp64Cmp,       /* DFP 64-bit compare, generating value into
518cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                           * int reg */
519cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pin_Dfp128Cmp,      /* DFP 128-bit  compare, generating value into
520cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                           * int reg */
521cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pin_DfpQuantize,    /* D64 quantize using register value, significance
522cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                           * round */
523cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj      Pin_DfpQuantize128, /* D128 quantize using register value, significance
524cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                           * round */
5253dee849ec7c38746749065e67dc53b75daa7617dsewardj      Pin_EvCheck,    /* Event check */
5263dee849ec7c38746749065e67dc53b75daa7617dsewardj      Pin_ProfInc     /* 64-bit profile counter increment */
527bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   }
5285b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCInstrTag;
529bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
530cd304497d9d869f9b24a002299d3953ee072229bcerion/* Destinations are on the LEFT (first operand) */
531bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
532bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fceriontypedef
533bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   struct {
5345b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion      PPCInstrTag tag;
535cd304497d9d869f9b24a002299d3953ee072229bcerion      union {
5365b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         /* Get a 32/64-bit literal into a register.
5375b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            May turn into a number of real insns. */
538b51f0f4f33256638ed953156a2635aa739b232f1sewardj         struct {
539b51f0f4f33256638ed953156a2635aa739b232f1sewardj            HReg dst;
540f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion            ULong imm64;
541f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         } LI;
542bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion         /* Integer add/sub/and/or/xor.  Limitations:
543b51f0f4f33256638ed953156a2635aa739b232f1sewardj            - For add, the immediate, if it exists, is a signed 16.
544b51f0f4f33256638ed953156a2635aa739b232f1sewardj            - For sub, the immediate, if it exists, is a signed 16
545b51f0f4f33256638ed953156a2635aa739b232f1sewardj              which may not be -32768, since no such instruction
546b51f0f4f33256638ed953156a2635aa739b232f1sewardj              exists, and so we have to emit addi with +32768, but
547b51f0f4f33256638ed953156a2635aa739b232f1sewardj              that is not possible.
548b51f0f4f33256638ed953156a2635aa739b232f1sewardj            - For and/or/xor,  the immediate, if it exists,
549b51f0f4f33256638ed953156a2635aa739b232f1sewardj              is an unsigned 16.
550b51f0f4f33256638ed953156a2635aa739b232f1sewardj         */
551cd304497d9d869f9b24a002299d3953ee072229bcerion         struct {
5525b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAluOp op;
5535b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg     dst;
5545b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg     srcL;
5555b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCRH*   srcR;
556f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         } Alu;
557bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion         /* Integer shl/shr/sar.
558bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion            Limitations: the immediate, if it exists,
559bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion            is a signed 5-bit value between 1 and 31 inclusive.
560bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion         */
561bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion         struct {
5625b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCShftOp op;
5635b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            Bool      sz32;   /* mode64 has both 32 and 64bit shft */
5645b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg      dst;
5655b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg      srcL;
5665b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCRH*    srcR;
567bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion         } Shft;
5684a49b0393204185f87664ea58f2b7a2ae1d37338cerion         /*  */
5694a49b0393204185f87664ea58f2b7a2ae1d37338cerion         struct {
5704a49b0393204185f87664ea58f2b7a2ae1d37338cerion            Bool isAdd;  /* else sub */
5714a49b0393204185f87664ea58f2b7a2ae1d37338cerion            Bool setC;   /* else read carry */
5724a49b0393204185f87664ea58f2b7a2ae1d37338cerion            HReg dst;
5734a49b0393204185f87664ea58f2b7a2ae1d37338cerion            HReg srcL;
5744a49b0393204185f87664ea58f2b7a2ae1d37338cerion            HReg srcR;
5755b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         } AddSubC;
576b51f0f4f33256638ed953156a2635aa739b232f1sewardj         /* If signed, the immediate, if it exists, is a signed 16,
577b51f0f4f33256638ed953156a2635aa739b232f1sewardj            else it is an unsigned 16. */
578cd304497d9d869f9b24a002299d3953ee072229bcerion         struct {
5795b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            Bool   syned;
5805b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            Bool   sz32;    /* mode64 has both 32 and 64bit cmp */
5815b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            UInt   crfD;
5825b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg   srcL;
5835b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCRH* srcR;
584f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         } Cmp;
5857fd5bb0dd6e9b745f8f8452f15cebb3c628d0a22sewardj         /* Not, Neg, Clz32/64, Extsw */
5862c49e036c365df707cd8e6622d66382f380557b2cerion         struct {
5875b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCUnaryOp op;
5885b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg       dst;
5895b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg       src;
5905b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         } Unary;
59192f5dc7ca4f50145028c4baebc783d196dfb67a2cerion         struct {
592b51f0f4f33256638ed953156a2635aa739b232f1sewardj            Bool syned;  /* meaningless if hi32==False */
593f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion            Bool hi;     /* False=>low, True=>high */
594bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion            Bool sz32;   /* mode64 has both 32 & 64bit mull */
595b51f0f4f33256638ed953156a2635aa739b232f1sewardj            HReg dst;
596b51f0f4f33256638ed953156a2635aa739b232f1sewardj            HReg srcL;
597b51f0f4f33256638ed953156a2635aa739b232f1sewardj            HReg srcR;
59892f5dc7ca4f50145028c4baebc783d196dfb67a2cerion         } MulL;
5999e263e3c24fcd4fd84855fe4f048884fb24a3a65cerion         /* ppc32 div/divu instruction. */
600c0e707e9b29f43821a5b505a468107992426aa7ecerion         struct {
6014aa412af1d8166cc11f39a6e721df49431d23618sewardj            Bool extended;
60233aa6da1102a12139debec996c33e4effa16f77ccerion            Bool syned;
603bb01b7cbfd84c27dd213f67a144ea5a99af36961cerion            Bool sz32;   /* mode64 has both 32 & 64bit div */
60433aa6da1102a12139debec996c33e4effa16f77ccerion            HReg dst;
605a2f75883f769b3cf13c32d5321cc9a6b7fcea9a6cerion            HReg srcL;
606a2f75883f769b3cf13c32d5321cc9a6b7fcea9a6cerion            HReg srcR;
607c0e707e9b29f43821a5b505a468107992426aa7ecerion         } Div;
6082c49e036c365df707cd8e6622d66382f380557b2cerion         /* Pseudo-insn.  Call target (an absolute address), on given
6096a64a9f0eddb932c55c2cd6c2c2ad2c6c4b6cafasewardj            condition (which could be Pct_ALWAYS).  argiregs indicates
6106a64a9f0eddb932c55c2cd6c2c2ad2c6c4b6cafasewardj            which of r3 .. r10 carries argument values for this call,
6116a64a9f0eddb932c55c2cd6c2c2ad2c6c4b6cafasewardj            using a bit mask (1<<N is set if rN holds an arg, for N in
6126a64a9f0eddb932c55c2cd6c2c2ad2c6c4b6cafasewardj            3 .. 10 inclusive). */
6132c49e036c365df707cd8e6622d66382f380557b2cerion         struct {
6145b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCCondCode cond;
6155b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            Addr64      target;
6165b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            UInt        argiregs;
617cfe046e178666280b87da998b1b52ecda03ecd89sewardj            RetLoc      rloc;     /* where the return value will be */
6182c49e036c365df707cd8e6622d66382f380557b2cerion         } Call;
6193dee849ec7c38746749065e67dc53b75daa7617dsewardj         /* Update the guest CIA value, then exit requesting to chain
6203dee849ec7c38746749065e67dc53b75daa7617dsewardj            to it.  May be conditional.  Use of Addr64 in order to cope
6213dee849ec7c38746749065e67dc53b75daa7617dsewardj            with 64-bit hosts. */
6222c49e036c365df707cd8e6622d66382f380557b2cerion         struct {
6233dee849ec7c38746749065e67dc53b75daa7617dsewardj            Addr64      dstGA;    /* next guest address */
6243dee849ec7c38746749065e67dc53b75daa7617dsewardj            PPCAMode*   amCIA;    /* amode in guest state for CIA */
6253dee849ec7c38746749065e67dc53b75daa7617dsewardj            PPCCondCode cond;     /* can be ALWAYS */
6263dee849ec7c38746749065e67dc53b75daa7617dsewardj            Bool        toFastEP; /* chain to the slow or fast point? */
6273dee849ec7c38746749065e67dc53b75daa7617dsewardj         } XDirect;
6283dee849ec7c38746749065e67dc53b75daa7617dsewardj         /* Boring transfer to a guest address not known at JIT time.
6293dee849ec7c38746749065e67dc53b75daa7617dsewardj            Not chainable.  May be conditional. */
6303dee849ec7c38746749065e67dc53b75daa7617dsewardj         struct {
6313dee849ec7c38746749065e67dc53b75daa7617dsewardj            HReg        dstGA;
6323dee849ec7c38746749065e67dc53b75daa7617dsewardj            PPCAMode*   amCIA;
6333dee849ec7c38746749065e67dc53b75daa7617dsewardj            PPCCondCode cond; /* can be ALWAYS */
6343dee849ec7c38746749065e67dc53b75daa7617dsewardj         } XIndir;
6353dee849ec7c38746749065e67dc53b75daa7617dsewardj         /* Assisted transfer to a guest address, most general case.
6363dee849ec7c38746749065e67dc53b75daa7617dsewardj            Not chainable.  May be conditional. */
6373dee849ec7c38746749065e67dc53b75daa7617dsewardj         struct {
6383dee849ec7c38746749065e67dc53b75daa7617dsewardj            HReg        dstGA;
6393dee849ec7c38746749065e67dc53b75daa7617dsewardj            PPCAMode*   amCIA;
6403dee849ec7c38746749065e67dc53b75daa7617dsewardj            PPCCondCode cond; /* can be ALWAYS */
6415b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            IRJumpKind  jk;
6423dee849ec7c38746749065e67dc53b75daa7617dsewardj         } XAssisted;
643b536af93912b69421440c27aa0533ad77d678f85cerion         /* Mov src to dst on the given condition, which may not
6449abfcbca0696407c4b781b9395298c5edffa33a0cerion            be the bogus Pct_ALWAYS. */
645b536af93912b69421440c27aa0533ad77d678f85cerion         struct {
6465b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCCondCode cond;
6475b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg        dst;
6485b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCRI*      src;
649f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         } CMov;
6507fd5bb0dd6e9b745f8f8452f15cebb3c628d0a22sewardj         /* Zero extending loads.  Dst size is host word size */
651cd304497d9d869f9b24a002299d3953ee072229bcerion         struct {
6525b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            UChar     sz; /* 1|2|4|8 */
6535b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg      dst;
6545b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAMode* src;
6557cf8e4e86f4d055ccb2d0c681c76100960a8e235cerion         } Load;
656e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj         /* Load-and-reserve (lwarx, ldarx) */
657e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj         struct {
658e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj            UChar sz; /* 4|8 */
659e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj            HReg  dst;
660e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj            HReg  src;
661e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj         } LoadL;
6625b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         /* 64/32/16/8 bit stores */
663cd304497d9d869f9b24a002299d3953ee072229bcerion         struct {
6645b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            UChar     sz; /* 1|2|4|8 */
6655b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAMode* dst;
6665b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg      src;
667cd304497d9d869f9b24a002299d3953ee072229bcerion         } Store;
668e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj         /* Store-conditional (stwcx., stdcx.) */
669e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj         struct {
670e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj            UChar sz; /* 4|8 */
671e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj            HReg  dst;
672e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj            HReg  src;
673e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj         } StoreC;
6745b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         /* Convert a ppc condition code to value 0 or 1. */
675b536af93912b69421440c27aa0533ad77d678f85cerion         struct {
6765b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCCondCode cond;
6775b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg        dst;
6785b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         } Set;
679b51f0f4f33256638ed953156a2635aa739b232f1sewardj         /* Move the entire CR to a GPR */
680b51f0f4f33256638ed953156a2635aa739b232f1sewardj         struct {
681b51f0f4f33256638ed953156a2635aa739b232f1sewardj            HReg dst;
682b51f0f4f33256638ed953156a2635aa739b232f1sewardj         } MfCR;
68398411db016ecb3bd1b8b72f75e4e3a49c95f4882cerion         /* Mem fence.  In short, an insn which flushes all preceding
68498411db016ecb3bd1b8b72f75e4e3a49c95f4882cerion            loads and stores as much as possible before continuing.
6855b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            On PPC we emit a "sync". */
68692f5dc7ca4f50145028c4baebc783d196dfb67a2cerion         struct {
68792f5dc7ca4f50145028c4baebc783d196dfb67a2cerion         } MFence;
688cd304497d9d869f9b24a002299d3953ee072229bcerion
6895b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         /* PPC Floating point */
690094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         struct {
6915b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCFpOp op;
6925b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    dst;
6935b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    src;
694094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         } FpUnary;
695094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         struct {
6965b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCFpOp op;
6975b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    dst;
6985b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcL;
6995b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcR;
700094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         } FpBinary;
701094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         struct {
70240c802659108a96bb87cbc1a30b7b77e2abd0829sewardj            PPCFpOp op;
70340c802659108a96bb87cbc1a30b7b77e2abd0829sewardj            HReg    dst;
70440c802659108a96bb87cbc1a30b7b77e2abd0829sewardj            HReg    srcML;
70540c802659108a96bb87cbc1a30b7b77e2abd0829sewardj            HReg    srcMR;
70640c802659108a96bb87cbc1a30b7b77e2abd0829sewardj            HReg    srcAcc;
70740c802659108a96bb87cbc1a30b7b77e2abd0829sewardj         } FpMulAcc;
70840c802659108a96bb87cbc1a30b7b77e2abd0829sewardj         struct {
7095b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            Bool      isLoad;
7105b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            UChar     sz; /* only 4 (IEEE single) or 8 (IEEE double) */
7115b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg      reg;
7125b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAMode* addr;
713094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         } FpLdSt;
714094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         struct {
71592923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj            HReg addr; /* int reg */
71692923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj            HReg data; /* float reg */
71792923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj         } FpSTFIW;
71892923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj         /* Round 64-bit FP value to 32-bit FP value in an FP reg. */
71907b07a966a2fdbcf621251a0c1a8ab84807fb120cerion         struct {
72007b07a966a2fdbcf621251a0c1a8ab84807fb120cerion            HReg src;
72107b07a966a2fdbcf621251a0c1a8ab84807fb120cerion            HReg dst;
72292923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj         } FpRSP;
7237d810d793616af057ce861746aa985df3304cb86sewardj         /* fcfid[u,s,us]/fctid[u]/fctiw[u].  Only some combinations
7247d810d793616af057ce861746aa985df3304cb86sewardj            of the various fields are allowed.  This is asserted for
7257d810d793616af057ce861746aa985df3304cb86sewardj            and documented in the code for the constructor,
7267d810d793616af057ce861746aa985df3304cb86sewardj            PPCInstr_FpCftI, in host_ppc_defs.c.  */
72707b07a966a2fdbcf621251a0c1a8ab84807fb120cerion         struct {
7287d810d793616af057ce861746aa985df3304cb86sewardj            Bool fromI; /* True== I->F,    False== F->I */
7297d810d793616af057ce861746aa985df3304cb86sewardj            Bool int32; /* True== I is 32, False== I is 64 */
73066d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj            Bool syned;
7317d810d793616af057ce861746aa985df3304cb86sewardj            Bool flt64; /* True== F is 64, False== F is 32 */
73207b07a966a2fdbcf621251a0c1a8ab84807fb120cerion            HReg src;
73307b07a966a2fdbcf621251a0c1a8ab84807fb120cerion            HReg dst;
73492923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj         } FpCftI;
73592923de6a68e5c84365b1fe5799c79815fd7d8e6sewardj         /* FP mov src to dst on the given condition. */
736094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         struct {
7375b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCCondCode cond;
7385b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg        dst;
7395b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg        src;
740094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         } FpCMov;
741094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         /* Load FP Status & Control Register */
742094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         struct {
743094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion            HReg src;
744c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            UInt dfp_rm;
745094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         } FpLdFPSCR;
746b51f0f4f33256638ed953156a2635aa739b232f1sewardj         /* Do a compare, generating result into an int register. */
747094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         struct {
748094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion            UChar crfD;
749094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion            HReg  dst;
750094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion            HReg  srcL;
751094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion            HReg  srcR;
752094d1397b3f69b1a538e80ab509ea8cd75f4be3bcerion         } FpCmp;
753cd304497d9d869f9b24a002299d3953ee072229bcerion
7547f000af9c21e3b5059e0b2d26bcb9ca378ae0e54cerion         /* Read/Write Link Register */
7557f000af9c21e3b5059e0b2d26bcb9ca378ae0e54cerion         struct {
7567f000af9c21e3b5059e0b2d26bcb9ca378ae0e54cerion            Bool wrLR;
7577f000af9c21e3b5059e0b2d26bcb9ca378ae0e54cerion            HReg gpr;
7587f000af9c21e3b5059e0b2d26bcb9ca378ae0e54cerion         } RdWrLR;
759c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion
760c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         /* Simplistic AltiVec */
761c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         struct {
7625b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            Bool      isLoad;
7635b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            UChar     sz;      /* 8|16|32|128 */
7645b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg      reg;
7655b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAMode* addr;
766c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         } AvLdSt;
767c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         struct {
7685b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAvOp op;
7695b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    dst;
7705b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    src;
771c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         } AvUnary;
772c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         struct {
7735b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAvOp op;
7745b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    dst;
7755b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcL;
7765b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcR;
777c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         } AvBinary;
7786b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         struct {
7795b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAvOp op;
7805b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    dst;
7815b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcL;
7825b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcR;
7836b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         } AvBin8x16;
7846b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         struct {
7855b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAvOp op;
7865b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    dst;
7875b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcL;
7885b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcR;
7896b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         } AvBin16x8;
7906b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         struct {
7915b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAvOp op;
7925b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    dst;
7935b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcL;
7945b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg    srcR;
7956b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         } AvBin32x4;
7960c74bb5aa3240f693df0568d578baabf0c376dc4carll         /* Can only be generated for CPUs capable of ISA 2.07 or above */
7970c74bb5aa3240f693df0568d578baabf0c376dc4carll         struct {
7980c74bb5aa3240f693df0568d578baabf0c376dc4carll            PPCAvOp op;
7990c74bb5aa3240f693df0568d578baabf0c376dc4carll            HReg    dst;
8000c74bb5aa3240f693df0568d578baabf0c376dc4carll            HReg    srcL;
8010c74bb5aa3240f693df0568d578baabf0c376dc4carll            HReg    srcR;
8020c74bb5aa3240f693df0568d578baabf0c376dc4carll         } AvBin64x2;
8036b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         struct {
8045b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAvFpOp op;
8056b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion            HReg      dst;
8066b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion            HReg      srcL;
8076b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion            HReg      srcR;
8086b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         } AvBin32Fx4;
8098ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion         struct {
8105b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCAvFpOp op;
8118ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion            HReg      dst;
8128ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion            HReg      src;
8138ea0d3ebfb8b1e4d8b6f851b0079c47a9886c686cerion         } AvUn32Fx4;
814c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         /* Perm,Sel,SlDbl,Splat are all weird AV permutations */
815c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         struct {
816c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg dst;
817c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg srcL;
818c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg srcR;
81992d9d876af80d14fa2f319f7109964f2d6231f15cerion            HReg ctl;
820c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         } AvPerm;
821c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         struct {
822c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg dst;
823c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg srcL;
824c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg srcR;
82592d9d876af80d14fa2f319f7109964f2d6231f15cerion            HReg ctl;
826c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         } AvSel;
827c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         struct {
8289877fe5792c32f04fa31018a72928903031a12e8carll            Bool  shLeft;
8299877fe5792c32f04fa31018a72928903031a12e8carll            HReg  dst;
83099de41eb08d8af693427594504313ecc8949fe21carll            PPCAMode* addr;
8319877fe5792c32f04fa31018a72928903031a12e8carll         } AvSh;
8329877fe5792c32f04fa31018a72928903031a12e8carll         struct {
833c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            UChar shift;
834c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg  dst;
835c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg  srcL;
836c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg  srcR;
837c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         } AvShlDbl;
838c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         struct {
839c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            UChar    sz;   /* 8,16,32 */
840c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg     dst;
8415b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCVI5s* src;
842c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         } AvSplat;
8436b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         /* Mov src to dst on the given condition, which may not
8446b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion            be the bogus Xcc_ALWAYS. */
8456b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         struct {
8465b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            PPCCondCode cond;
8475b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg        dst;
8485b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion            HReg        src;
8496b6f59eabd7c38edf6732b8e127eb2913b44cbf6cerion         } AvCMov;
850b51f0f4f33256638ed953156a2635aa739b232f1sewardj         /* Load AltiVec Status & Control Register */
851c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         struct {
852c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion            HReg src;
853c3d8bdcb51893e6d23ab9b27122741208a044cf1cerion         } AvLdVSCR;
854c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj         struct {
8557deaf9552b546b847528cf39b38898fb7742b5f5carll            PPCAvOp   op;
8567deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg      dst;
8577deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg      src;
8587deaf9552b546b847528cf39b38898fb7742b5f5carll         } AvCipherV128Unary;
8597deaf9552b546b847528cf39b38898fb7742b5f5carll         struct {
8607deaf9552b546b847528cf39b38898fb7742b5f5carll            PPCAvOp     op;
8617deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg       dst;
8627deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg       src;
8637deaf9552b546b847528cf39b38898fb7742b5f5carll            PPCRI* s_field;
8647deaf9552b546b847528cf39b38898fb7742b5f5carll         } AvHashV128Binary;
8657deaf9552b546b847528cf39b38898fb7742b5f5carll         struct {
8667deaf9552b546b847528cf39b38898fb7742b5f5carll            PPCAvOp     op;
8677deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg       dst;
8687deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg      src1;
8697deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg      src2;
8707deaf9552b546b847528cf39b38898fb7742b5f5carll            PPCRI*      ps;
8717deaf9552b546b847528cf39b38898fb7742b5f5carll         } AvBCDV128Trinary;
8727deaf9552b546b847528cf39b38898fb7742b5f5carll         struct {
8737deaf9552b546b847528cf39b38898fb7742b5f5carll            PPCAvOp   op;
8747deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg      dst;
8757deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg      srcL;
8767deaf9552b546b847528cf39b38898fb7742b5f5carll            HReg      srcR;
8777deaf9552b546b847528cf39b38898fb7742b5f5carll         } AvCipherV128Binary;
8787deaf9552b546b847528cf39b38898fb7742b5f5carll         struct {
879c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            PPCFpOp op;
880c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg dst;
881c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg src;
882c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj         } Dfp64Unary;
883c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj         struct {
884c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            PPCFpOp op;
885c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg dst;
886c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg srcL;
887c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg srcR;
888c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj         } Dfp64Binary;
889c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj         struct {
890c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            PPCFpOp op;
89126217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   dst;
89226217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   src;
89326217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            PPCRI* shift;
89426217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj         } DfpShift;
89526217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj         struct {
89626217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            PPCFpOp op;
897c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg dst_hi;
898c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg dst_lo;
899c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg src_hi;
900c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg src_lo;
901c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj         } Dfp128Unary;
902c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj         struct {
903c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            /* The dst is used to pass the left source operand in and return
904c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj             * the result.
905c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj             */
906c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            PPCFpOp op;
907c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg dst_hi;
908c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg dst_lo;
909c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg srcR_hi;
910c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj            HReg srcR_lo;
911c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj         } Dfp128Binary;
91226217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj         struct {
91326217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            PPCFpOp op;
91426217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   dst_hi;
91526217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   dst_lo;
91626217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   src_hi;
91726217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   src_lo;
91826217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            PPCRI* shift;
91926217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj         } DfpShift128;
92026217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj         struct {
921cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg dst;
922cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg src;
923cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            PPCRI* r_rmc;
924cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         } DfpRound;
925cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         struct {
926cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg dst_hi;
927cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg dst_lo;
928cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg src_hi;
929cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg src_lo;
930cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            PPCRI* r_rmc;
931cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         } DfpRound128;
932cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         struct {
933cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj	    PPCFpOp op;
934cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg dst;
935cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg srcL;
936cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg srcR;
937cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            PPCRI* rmc;
938cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         } DfpQuantize;
939cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         struct {
940cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj	    PPCFpOp op;
941cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg dst_hi;
942cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg dst_lo;
943cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg src_hi;
944cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg src_lo;
945cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj  	    PPCRI* rmc;
946cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         } DfpQuantize128;
947cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         struct {
948cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            PPCFpOp op;
949cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg dst;
950cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg src_hi;
951cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg src_lo;
952cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         } ExtractExpD128;
953cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         struct {
954cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj	    PPCFpOp op;
955cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg dst_hi;
956cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg dst_lo;
957cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg srcL;
958cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg srcR_hi;
959cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg srcR_lo;
960cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         } InsertExpD128;
961cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         struct {
96226217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            PPCFpOp op;
96326217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   dst;
96426217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   src_hi;
96526217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   src_lo;
96626217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj         } DfpD128toD64;
96726217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj         struct {
96826217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            PPCFpOp op;
96926217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   dst_hi;
97026217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   dst_lo;
97126217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj            HReg   src;
97226217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj         } DfpI64StoD128;
9733dee849ec7c38746749065e67dc53b75daa7617dsewardj         struct {
974cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            UChar crfD;
975cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg  dst;
976cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg  srcL;
977cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg  srcR;
978cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         } Dfp64Cmp;
979cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         struct {
980cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            UChar crfD;
981cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg  dst;
982cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg  srcL_hi;
983cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg  srcL_lo;
984cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg  srcR_hi;
985cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj            HReg  srcR_lo;
986cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         } Dfp128Cmp;
987cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj         struct {
9883dee849ec7c38746749065e67dc53b75daa7617dsewardj            PPCAMode* amCounter;
9893dee849ec7c38746749065e67dc53b75daa7617dsewardj            PPCAMode* amFailAddr;
9903dee849ec7c38746749065e67dc53b75daa7617dsewardj         } EvCheck;
9913dee849ec7c38746749065e67dc53b75daa7617dsewardj         struct {
9923dee849ec7c38746749065e67dc53b75daa7617dsewardj            /* No fields.  The address of the counter to inc is
9933dee849ec7c38746749065e67dc53b75daa7617dsewardj               installed later, post-translation, by patching it in,
9943dee849ec7c38746749065e67dc53b75daa7617dsewardj               as it is not known at translation time. */
9953dee849ec7c38746749065e67dc53b75daa7617dsewardj         } ProfInc;
996c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj      } Pin;
997bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   }
9985b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   PPCInstr;
9995b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion
10005b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion
10015b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_LI         ( HReg, ULong, Bool );
10025b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_Alu        ( PPCAluOp, HReg, HReg, PPCRH* );
10035b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_Shft       ( PPCShftOp, Bool sz32, HReg, HReg, PPCRH* );
10045b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AddSubC    ( Bool, Bool, HReg, HReg, HReg );
10055b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_Cmp        ( Bool, Bool, UInt, HReg, PPCRH* );
10065b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_Unary      ( PPCUnaryOp op, HReg dst, HReg src );
10075b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_MulL       ( Bool syned, Bool hi32, Bool sz32, HReg, HReg, HReg );
10084aa412af1d8166cc11f39a6e721df49431d23618sewardjextern PPCInstr* PPCInstr_Div        ( Bool extended, Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR );
1009cfe046e178666280b87da998b1b52ecda03ecd89sewardjextern PPCInstr* PPCInstr_Call       ( PPCCondCode, Addr64, UInt, RetLoc );
10103dee849ec7c38746749065e67dc53b75daa7617dsewardjextern PPCInstr* PPCInstr_XDirect    ( Addr64 dstGA, PPCAMode* amCIA,
10113dee849ec7c38746749065e67dc53b75daa7617dsewardj                                       PPCCondCode cond, Bool toFastEP );
10123dee849ec7c38746749065e67dc53b75daa7617dsewardjextern PPCInstr* PPCInstr_XIndir     ( HReg dstGA, PPCAMode* amCIA,
10133dee849ec7c38746749065e67dc53b75daa7617dsewardj                                       PPCCondCode cond );
10143dee849ec7c38746749065e67dc53b75daa7617dsewardjextern PPCInstr* PPCInstr_XAssisted  ( HReg dstGA, PPCAMode* amCIA,
10153dee849ec7c38746749065e67dc53b75daa7617dsewardj                                       PPCCondCode cond, IRJumpKind jk );
10165b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_CMov       ( PPCCondCode, HReg dst, PPCRI* src );
10177fd5bb0dd6e9b745f8f8452f15cebb3c628d0a22sewardjextern PPCInstr* PPCInstr_Load       ( UChar sz,
10185b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion                                       HReg dst, PPCAMode* src, Bool mode64 );
1019e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardjextern PPCInstr* PPCInstr_LoadL      ( UChar sz,
1020e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj                                       HReg dst, HReg src, Bool mode64 );
10215b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_Store      ( UChar sz, PPCAMode* dst,
10225b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion                                       HReg src, Bool mode64 );
1023e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardjextern PPCInstr* PPCInstr_StoreC     ( UChar sz, HReg dst, HReg src,
1024e9d8a26b690c2561ac54ab0cd6ad83ecbadcbe76sewardj                                       Bool mode64 );
10255b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_Set        ( PPCCondCode cond, HReg dst );
10265b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_MfCR       ( HReg dst );
10275b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_MFence     ( void );
10285b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion
10295b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_FpUnary    ( PPCFpOp op, HReg dst, HReg src );
10305b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_FpBinary   ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR );
103140c802659108a96bb87cbc1a30b7b77e2abd0829sewardjextern PPCInstr* PPCInstr_FpMulAcc   ( PPCFpOp op, HReg dst, HReg srcML,
103240c802659108a96bb87cbc1a30b7b77e2abd0829sewardj                                                   HReg srcMR, HReg srcAcc );
10335b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_FpLdSt     ( Bool isLoad, UChar sz, HReg, PPCAMode* );
103492923de6a68e5c84365b1fe5799c79815fd7d8e6sewardjextern PPCInstr* PPCInstr_FpSTFIW    ( HReg addr, HReg data );
103592923de6a68e5c84365b1fe5799c79815fd7d8e6sewardjextern PPCInstr* PPCInstr_FpRSP      ( HReg dst, HReg src );
103666d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardjextern PPCInstr* PPCInstr_FpCftI     ( Bool fromI, Bool int32, Bool syned,
103766d5ef2c2a31fb52cdd4f02304489e30268ea13fsewardj                                       Bool dst64, HReg dst, HReg src );
10385b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_FpCMov     ( PPCCondCode, HReg dst, HReg src );
1039c6bbd470e9bd9898b84959227a406d3972d95f3bsewardjextern PPCInstr* PPCInstr_FpLdFPSCR  ( HReg src, Bool dfp_rm );
10405b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_FpCmp      ( HReg dst, HReg srcL, HReg srcR );
10415b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion
10425b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_RdWrLR     ( Bool wrLR, HReg gpr );
10435b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion
10445b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvLdSt     ( Bool isLoad, UChar sz, HReg, PPCAMode* );
10455b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvUnary    ( PPCAvOp op, HReg dst, HReg src );
10465b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvBinary   ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
10475b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvBin8x16  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
10485b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvBin16x8  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
10495b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvBin32x4  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
10500c74bb5aa3240f693df0568d578baabf0c376dc4carllextern PPCInstr* PPCInstr_AvBin64x2  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1051e522d4bbf9e59873859c2f0693450a176fb2b996sewardjextern PPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, HReg srcL, HReg srcR );
1052e522d4bbf9e59873859c2f0693450a176fb2b996sewardjextern PPCInstr* PPCInstr_AvUn32Fx4  ( PPCAvFpOp op, HReg dst, HReg src );
10535b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvPerm     ( HReg dst, HReg srcL, HReg srcR, HReg ctl );
10545b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvSel      ( HReg ctl, HReg dst, HReg srcL, HReg srcR );
10559877fe5792c32f04fa31018a72928903031a12e8carllextern PPCInstr* PPCInstr_AvSh       ( Bool shLeft, HReg dst, PPCAMode* am_addr );
10565b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvShlDbl   ( UChar shift, HReg dst, HReg srcL, HReg srcR );
10575b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvSplat    ( UChar sz, HReg dst, PPCVI5s* src );
10585b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvCMov     ( PPCCondCode, HReg dst, HReg src );
10595b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerionextern PPCInstr* PPCInstr_AvLdVSCR   ( HReg src );
10607deaf9552b546b847528cf39b38898fb7742b5f5carllextern PPCInstr* PPCInstr_AvCipherV128Unary  ( PPCAvOp op, HReg dst,
10617deaf9552b546b847528cf39b38898fb7742b5f5carll                                               HReg srcR );
10627deaf9552b546b847528cf39b38898fb7742b5f5carllextern PPCInstr* PPCInstr_AvCipherV128Binary ( PPCAvOp op, HReg dst,
10637deaf9552b546b847528cf39b38898fb7742b5f5carll                                               HReg srcL, HReg srcR );
10647deaf9552b546b847528cf39b38898fb7742b5f5carllextern PPCInstr* PPCInstr_AvHashV128Binary ( PPCAvOp op, HReg dst,
10657deaf9552b546b847528cf39b38898fb7742b5f5carll                                             HReg src, PPCRI* s_field );
10667deaf9552b546b847528cf39b38898fb7742b5f5carllextern PPCInstr* PPCInstr_AvBCDV128Trinary ( PPCAvOp op, HReg dst,
10677deaf9552b546b847528cf39b38898fb7742b5f5carll                                             HReg src1, HReg src2,
10687deaf9552b546b847528cf39b38898fb7742b5f5carll                                             PPCRI* ps );
1069c6bbd470e9bd9898b84959227a406d3972d95f3bsewardjextern PPCInstr* PPCInstr_Dfp64Unary  ( PPCFpOp op, HReg dst, HReg src );
1070c6bbd470e9bd9898b84959227a406d3972d95f3bsewardjextern PPCInstr* PPCInstr_Dfp64Binary ( PPCFpOp op, HReg dst, HReg srcL,
1071c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj                                        HReg srcR );
107226217b09205cc1801b842ba5ba8f0d83aabca1b4sewardjextern PPCInstr* PPCInstr_DfpShift    ( PPCFpOp op, HReg dst, HReg src,
1073cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                        PPCRI* shift );
107426217b09205cc1801b842ba5ba8f0d83aabca1b4sewardjextern PPCInstr* PPCInstr_Dfp128Unary  ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
107526217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj                                         HReg srcR_hi, HReg srcR_lo );
107626217b09205cc1801b842ba5ba8f0d83aabca1b4sewardjextern PPCInstr* PPCInstr_Dfp128Binary ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
107726217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj                                         HReg srcR_hi, HReg srcR_lo );
107826217b09205cc1801b842ba5ba8f0d83aabca1b4sewardjextern PPCInstr* PPCInstr_DfpShift128  ( PPCFpOp op, HReg dst_hi, HReg src_hi,
107926217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj                                         HReg dst_lo, HReg src_lo,
108026217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj                                         PPCRI* shift );
108126217b09205cc1801b842ba5ba8f0d83aabca1b4sewardjextern PPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst,
108226217b09205cc1801b842ba5ba8f0d83aabca1b4sewardj                                         HReg dst_lo, HReg src_lo);
1083cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardjextern PPCInstr* PPCInstr_DfpI64StoD128  ( PPCFpOp op, HReg dst_hi,
1084cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg dst_lo, HReg src);
1085cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardjextern PPCInstr* PPCInstr_DfpRound       ( HReg dst, HReg src, PPCRI* r_rmc );
1086cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardjextern PPCInstr* PPCInstr_DfpRound128    ( HReg dst_hi, HReg dst_lo, HReg src_hi,
1087cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg src_lo, PPCRI* r_rmc );
1088a7b0d10848b63ff9d0608187c13134aded7a3c47florianextern PPCInstr* PPCInstr_DfpQuantize    ( PPCFpOp op, HReg dst, HReg srcL,
1089cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg srcR, PPCRI* rmc );
1090a7b0d10848b63ff9d0608187c13134aded7a3c47florianextern PPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi,
1091cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg dst_lo,
1092cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg src_hi,
1093cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg src_lo, PPCRI* rmc );
1094cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardjextern PPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op,   HReg dst,
1095cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg src_hi, HReg src_lo );
1096cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardjextern PPCInstr* PPCInstr_InsertExpD128  ( PPCFpOp op,   HReg dst_hi,
1097cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg dst_lo,  HReg srcL,
1098cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg srcR_hi, HReg srcR_lo );
1099cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardjextern PPCInstr* PPCInstr_Dfp64Cmp       ( HReg dst, HReg srcL, HReg srcR );
1100cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardjextern PPCInstr* PPCInstr_Dfp128Cmp      ( HReg dst, HReg srcL_hi, HReg srcL_lo,
1101cdc376dcb5a4560b0a35d4abcb2146c499756f0dsewardj                                           HReg srcR_hi, HReg srcR_lo );
11023dee849ec7c38746749065e67dc53b75daa7617dsewardjextern PPCInstr* PPCInstr_EvCheck     ( PPCAMode* amCounter,
11033dee849ec7c38746749065e67dc53b75daa7617dsewardj                                        PPCAMode* amFailAddr );
11043dee849ec7c38746749065e67dc53b75daa7617dsewardjextern PPCInstr* PPCInstr_ProfInc     ( void );
1105c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj
1106d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern void ppPPCInstr(const PPCInstr*, Bool mode64);
1107c6bbd470e9bd9898b84959227a406d3972d95f3bsewardj
1108bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
1109bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion/* Some functions that insulate the register allocator from details
1110bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion   of the underlying instruction set. */
1111d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern void getRegUsage_PPCInstr ( HRegUsage*, const PPCInstr*, Bool mode64 );
1112d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern void mapRegs_PPCInstr     ( HRegRemap*, PPCInstr* , Bool mode64);
1113d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern Bool isMove_PPCInstr      ( const PPCInstr*, HReg*, HReg* );
11148462d113e3efeacceb304222dada8d85f748295aflorianextern Int          emit_PPCInstr   ( /*MB_MOD*/Bool* is_profInc,
1115d8c64e082224b2e688abdef9219cc76fd82b373bflorian                                      UChar* buf, Int nbuf, const PPCInstr* i,
11168462d113e3efeacceb304222dada8d85f748295aflorian                                      Bool mode64,
11178462d113e3efeacceb304222dada8d85f748295aflorian                                      VexEndness endness_host,
11188462d113e3efeacceb304222dada8d85f748295aflorian                                      const void* disp_cp_chain_me_to_slowEP,
11198462d113e3efeacceb304222dada8d85f748295aflorian                                      const void* disp_cp_chain_me_to_fastEP,
11208462d113e3efeacceb304222dada8d85f748295aflorian                                      const void* disp_cp_xindir,
11218462d113e3efeacceb304222dada8d85f748295aflorian                                      const void* disp_cp_xassisted );
11222a0cc858191d0ef9b5bb2072d6a164d4bc82b027sewardj
11232a0cc858191d0ef9b5bb2072d6a164d4bc82b027sewardjextern void genSpill_PPC  ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
11242a0cc858191d0ef9b5bb2072d6a164d4bc82b027sewardj                            HReg rreg, Int offsetB, Bool mode64 );
11252a0cc858191d0ef9b5bb2072d6a164d4bc82b027sewardjextern void genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
11262a0cc858191d0ef9b5bb2072d6a164d4bc82b027sewardj                            HReg rreg, Int offsetB, Bool mode64 );
11272a0cc858191d0ef9b5bb2072d6a164d4bc82b027sewardj
1128a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjextern const RRegUniverse* getRRegUniverse_PPC ( Bool mode64 );
1129a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj
1130cacba8e675988fbf21b08feea1f317a9c896c053florianextern HInstrArray* iselSB_PPC           ( const IRSB*,
11313dee849ec7c38746749065e67dc53b75daa7617dsewardj                                           VexArch,
1132d8c64e082224b2e688abdef9219cc76fd82b373bflorian                                           const VexArchInfo*,
1133d8c64e082224b2e688abdef9219cc76fd82b373bflorian                                           const VexAbiInfo*,
11343dee849ec7c38746749065e67dc53b75daa7617dsewardj                                           Int offs_Host_EvC_Counter,
11353dee849ec7c38746749065e67dc53b75daa7617dsewardj                                           Int offs_Host_EvC_FailAddr,
11363dee849ec7c38746749065e67dc53b75daa7617dsewardj                                           Bool chainingAllowed,
11373dee849ec7c38746749065e67dc53b75daa7617dsewardj                                           Bool addProfInc,
1138dcd6d236c9aef7d4c84369d4c51f6b92ac910127florian                                           Addr max_ga );
11393dee849ec7c38746749065e67dc53b75daa7617dsewardj
11403dee849ec7c38746749065e67dc53b75daa7617dsewardj/* How big is an event check?  This is kind of a kludge because it
11413dee849ec7c38746749065e67dc53b75daa7617dsewardj   depends on the offsets of host_EvC_FAILADDR and
11423dee849ec7c38746749065e67dc53b75daa7617dsewardj   host_EvC_COUNTER. */
11437ce2cc883c5b36586babec833838951ecf9f2a76florianextern Int evCheckSzB_PPC (void);
11443dee849ec7c38746749065e67dc53b75daa7617dsewardj
11453dee849ec7c38746749065e67dc53b75daa7617dsewardj/* Perform a chaining and unchaining of an XDirect jump. */
11469b76916dcc1628e133d57db001563429c6e3a590sewardjextern VexInvalRange chainXDirect_PPC ( VexEndness endness_host,
11479b76916dcc1628e133d57db001563429c6e3a590sewardj                                        void* place_to_chain,
11487d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                        const void* disp_cp_chain_me_EXPECTED,
11497d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                        const void* place_to_jump_to,
11503dee849ec7c38746749065e67dc53b75daa7617dsewardj                                        Bool  mode64 );
11513dee849ec7c38746749065e67dc53b75daa7617dsewardj
11529b76916dcc1628e133d57db001563429c6e3a590sewardjextern VexInvalRange unchainXDirect_PPC ( VexEndness endness_host,
11539b76916dcc1628e133d57db001563429c6e3a590sewardj                                          void* place_to_unchain,
11547d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                          const void* place_to_jump_to_EXPECTED,
11557d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                          const void* disp_cp_chain_me,
11563dee849ec7c38746749065e67dc53b75daa7617dsewardj                                          Bool  mode64 );
11573dee849ec7c38746749065e67dc53b75daa7617dsewardj
11583dee849ec7c38746749065e67dc53b75daa7617dsewardj/* Patch the counter location into an existing ProfInc point. */
11599b76916dcc1628e133d57db001563429c6e3a590sewardjextern VexInvalRange patchProfInc_PPC ( VexEndness endness_host,
11609b76916dcc1628e133d57db001563429c6e3a590sewardj                                        void*  place_to_patch,
11617d6f81de12e6d8deb3e119ab318f361d97a10a65florian                                        const ULong* location_of_counter,
11623dee849ec7c38746749065e67dc53b75daa7617dsewardj                                        Bool   mode64 );
11633dee849ec7c38746749065e67dc53b75daa7617dsewardj
11645b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion
1165cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#endif /* ndef __VEX_HOST_PPC_DEFS_H */
1166bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion
1167bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion/*---------------------------------------------------------------*/
1168cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj/*--- end                                     host_ppc_defs.h ---*/
1169bcf8c3ed0466b8876535f68f9ca5c31f5fd8a26fcerion/*---------------------------------------------------------------*/
1170