blob: b5b7bf73498db088a314d7bf3c6314ac0e368cf9 [file] [log] [blame]
cerionbcf8c3e2005-02-04 16:17:07 +00001
2/*---------------------------------------------------------------*/
sewardj752f9062010-05-03 21:38:49 +00003/*--- begin host_ppc_defs.h ---*/
cerionbcf8c3e2005-02-04 16:17:07 +00004/*---------------------------------------------------------------*/
5
6/*
sewardj752f9062010-05-03 21:38:49 +00007 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
cerionbcf8c3e2005-02-04 16:17:07 +00009
sewardj89ae8472013-10-18 14:12:58 +000010 Copyright (C) 2004-2013 OpenWorks LLP
sewardj752f9062010-05-03 21:38:49 +000011 info@open-works.net
cerionbcf8c3e2005-02-04 16:17:07 +000012
sewardj752f9062010-05-03 21:38:49 +000013 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
cerionbcf8c3e2005-02-04 16:17:07 +000017
sewardj752f9062010-05-03 21:38:49 +000018 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
sewardj7bd6ffe2005-08-03 16:07:36 +000026 02110-1301, USA.
27
sewardj752f9062010-05-03 21:38:49 +000028 The GNU General Public License is contained in the file COPYING.
cerionbcf8c3e2005-02-04 16:17:07 +000029
30 Neither the names of the U.S. Department of Energy nor the
31 University of California nor the names of its contributors may be
32 used to endorse or promote products derived from this software
33 without prior written permission.
cerionbcf8c3e2005-02-04 16:17:07 +000034*/
35
sewardjcef7d3e2009-07-02 12:21:59 +000036#ifndef __VEX_HOST_PPC_DEFS_H
37#define __VEX_HOST_PPC_DEFS_H
cerionbcf8c3e2005-02-04 16:17:07 +000038
florian58a637b2012-09-30 20:30:17 +000039#include "libvex_basictypes.h"
40#include "libvex.h" // VexArch
41#include "host_generic_regs.h" // HReg
42
cerion2c49e032005-02-09 17:29:49 +000043/* Num registers used for function calls */
cerionf0de28c2005-12-13 20:21:11 +000044#define PPC_N_REGPARMS 8
cerion2c49e032005-02-09 17:29:49 +000045
cerionbcf8c3e2005-02-04 16:17:07 +000046
47/* --------- Registers. --------- */
48
49/* The usual HReg abstraction. There are 32 real int regs,
cerion225a0342005-09-12 20:49:09 +000050 32 real float regs, and 32 real vector regs.
cerionbcf8c3e2005-02-04 16:17:07 +000051*/
52
cerion5b2325f2005-12-23 00:55:09 +000053extern void ppHRegPPC ( HReg );
cerionbcf8c3e2005-02-04 16:17:07 +000054
cerionf0de28c2005-12-13 20:21:11 +000055extern HReg hregPPC_GPR0 ( Bool mode64 ); // scratch reg / zero reg
56extern HReg hregPPC_GPR1 ( Bool mode64 ); // Stack Frame Pointer
57extern HReg hregPPC_GPR2 ( Bool mode64 ); // not used: TOC pointer
58extern HReg hregPPC_GPR3 ( Bool mode64 );
59extern HReg hregPPC_GPR4 ( Bool mode64 );
60extern HReg hregPPC_GPR5 ( Bool mode64 );
61extern HReg hregPPC_GPR6 ( Bool mode64 );
62extern HReg hregPPC_GPR7 ( Bool mode64 );
63extern HReg hregPPC_GPR8 ( Bool mode64 );
64extern HReg hregPPC_GPR9 ( Bool mode64 );
65extern HReg hregPPC_GPR10 ( Bool mode64 );
cerion5b2325f2005-12-23 00:55:09 +000066extern HReg hregPPC_GPR11 ( Bool mode64 );
67extern HReg hregPPC_GPR12 ( Bool mode64 );
68extern HReg hregPPC_GPR13 ( Bool mode64 );
cerionf0de28c2005-12-13 20:21:11 +000069extern HReg hregPPC_GPR14 ( Bool mode64 );
70extern HReg hregPPC_GPR15 ( Bool mode64 );
71extern HReg hregPPC_GPR16 ( Bool mode64 );
72extern HReg hregPPC_GPR17 ( Bool mode64 );
73extern HReg hregPPC_GPR18 ( Bool mode64 );
74extern HReg hregPPC_GPR19 ( Bool mode64 );
75extern HReg hregPPC_GPR20 ( Bool mode64 );
76extern HReg hregPPC_GPR21 ( Bool mode64 );
77extern HReg hregPPC_GPR22 ( Bool mode64 );
78extern HReg hregPPC_GPR23 ( Bool mode64 );
79extern HReg hregPPC_GPR24 ( Bool mode64 );
80extern HReg hregPPC_GPR25 ( Bool mode64 );
81extern HReg hregPPC_GPR26 ( Bool mode64 );
82extern HReg hregPPC_GPR27 ( Bool mode64 );
83extern HReg hregPPC_GPR28 ( Bool mode64 );
sewardjb8a8dba2005-12-15 21:33:50 +000084extern HReg hregPPC_GPR29 ( Bool mode64 ); // reserved for dispatcher
cerion5b2325f2005-12-23 00:55:09 +000085extern HReg hregPPC_GPR30 ( Bool mode64 ); // used as VMX spill temp
sewardjb8a8dba2005-12-15 21:33:50 +000086extern HReg hregPPC_GPR31 ( Bool mode64 ); // GuestStatePtr (callee-saved)
cerionbcf8c3e2005-02-04 16:17:07 +000087
cerion5b2325f2005-12-23 00:55:09 +000088extern HReg hregPPC_FPR0 ( void );
89extern HReg hregPPC_FPR1 ( void );
90extern HReg hregPPC_FPR2 ( void );
91extern HReg hregPPC_FPR3 ( void );
92extern HReg hregPPC_FPR4 ( void );
93extern HReg hregPPC_FPR5 ( void );
94extern HReg hregPPC_FPR6 ( void );
95extern HReg hregPPC_FPR7 ( void );
96extern HReg hregPPC_FPR8 ( void );
97extern HReg hregPPC_FPR9 ( void );
98extern HReg hregPPC_FPR10 ( void );
99extern HReg hregPPC_FPR11 ( void );
100extern HReg hregPPC_FPR12 ( void );
101extern HReg hregPPC_FPR13 ( void );
102extern HReg hregPPC_FPR14 ( void );
103extern HReg hregPPC_FPR15 ( void );
104extern HReg hregPPC_FPR16 ( void );
105extern HReg hregPPC_FPR17 ( void );
106extern HReg hregPPC_FPR18 ( void );
107extern HReg hregPPC_FPR19 ( void );
108extern HReg hregPPC_FPR20 ( void );
109extern HReg hregPPC_FPR21 ( void );
110extern HReg hregPPC_FPR22 ( void );
111extern HReg hregPPC_FPR23 ( void );
112extern HReg hregPPC_FPR24 ( void );
113extern HReg hregPPC_FPR25 ( void );
114extern HReg hregPPC_FPR26 ( void );
115extern HReg hregPPC_FPR27 ( void );
116extern HReg hregPPC_FPR28 ( void );
117extern HReg hregPPC_FPR29 ( void );
118extern HReg hregPPC_FPR30 ( void );
119extern HReg hregPPC_FPR31 ( void );
cerionbcf8c3e2005-02-04 16:17:07 +0000120
cerion5b2325f2005-12-23 00:55:09 +0000121extern HReg hregPPC_VR0 ( void );
122extern HReg hregPPC_VR1 ( void );
123extern HReg hregPPC_VR2 ( void );
124extern HReg hregPPC_VR3 ( void );
125extern HReg hregPPC_VR4 ( void );
126extern HReg hregPPC_VR5 ( void );
127extern HReg hregPPC_VR6 ( void );
128extern HReg hregPPC_VR7 ( void );
129extern HReg hregPPC_VR8 ( void );
130extern HReg hregPPC_VR9 ( void );
131extern HReg hregPPC_VR10 ( void );
132extern HReg hregPPC_VR11 ( void );
133extern HReg hregPPC_VR12 ( void );
134extern HReg hregPPC_VR13 ( void );
135extern HReg hregPPC_VR14 ( void );
136extern HReg hregPPC_VR15 ( void );
137extern HReg hregPPC_VR16 ( void );
138extern HReg hregPPC_VR17 ( void );
139extern HReg hregPPC_VR18 ( void );
140extern HReg hregPPC_VR19 ( void );
141extern HReg hregPPC_VR20 ( void );
142extern HReg hregPPC_VR21 ( void );
143extern HReg hregPPC_VR22 ( void );
144extern HReg hregPPC_VR23 ( void );
145extern HReg hregPPC_VR24 ( void );
146extern HReg hregPPC_VR25 ( void );
147extern HReg hregPPC_VR26 ( void );
148extern HReg hregPPC_VR27 ( void );
149extern HReg hregPPC_VR28 ( void );
150extern HReg hregPPC_VR29 ( void );
151extern HReg hregPPC_VR30 ( void );
152extern HReg hregPPC_VR31 ( void );
cerionbcf8c3e2005-02-04 16:17:07 +0000153
cerionf0de28c2005-12-13 20:21:11 +0000154#define StackFramePtr(_mode64) hregPPC_GPR1(_mode64)
155#define GuestStatePtr(_mode64) hregPPC_GPR31(_mode64)
cerionbcf8c3e2005-02-04 16:17:07 +0000156
cerion2c49e032005-02-09 17:29:49 +0000157
158
sewardjb51f0f42005-07-18 11:38:02 +0000159/* --------- Condition codes --------- */
cerion2c49e032005-02-09 17:29:49 +0000160
sewardjb51f0f42005-07-18 11:38:02 +0000161/* This gives names from bitfields in CR; hence it names BI numbers */
162/* Using IBM/hardware indexing convention */
cerion2c49e032005-02-09 17:29:49 +0000163typedef
sewardjb51f0f42005-07-18 11:38:02 +0000164 enum {
165 // CR7, which we use for integer compares
166 Pcf_7LT = 28, /* neg | lt */
167 Pcf_7GT = 29, /* pos | gt */
168 Pcf_7EQ = 30, /* zero | equal */
sewardj7e308072011-05-04 09:50:48 +0000169 Pcf_7SO = 31, /* summary overflow */
170 Pcf_NONE = 32 /* no condition; used with Pct_ALWAYS */
cerionab9132d2005-02-15 15:46:59 +0000171 }
cerion5b2325f2005-12-23 00:55:09 +0000172 PPCCondFlag;
cerion2c49e032005-02-09 17:29:49 +0000173
cerionab9132d2005-02-15 15:46:59 +0000174typedef
cerion7cf8e4e2005-02-16 16:08:17 +0000175 enum { /* Maps bc bitfield BO */
sewardj7e308072011-05-04 09:50:48 +0000176 Pct_FALSE = 0x4, /* associated PPCCondFlag must not be Pcf_NONE */
177 Pct_TRUE = 0xC, /* associated PPCCondFlag must not be Pcf_NONE */
178 Pct_ALWAYS = 0x14 /* associated PPCCondFlag must be Pcf_NONE */
cerionab9132d2005-02-15 15:46:59 +0000179 }
cerion5b2325f2005-12-23 00:55:09 +0000180 PPCCondTest;
cerionab9132d2005-02-15 15:46:59 +0000181
182typedef
183 struct {
cerion5b2325f2005-12-23 00:55:09 +0000184 PPCCondFlag flag;
185 PPCCondTest test;
cerion2c49e032005-02-09 17:29:49 +0000186 }
cerion5b2325f2005-12-23 00:55:09 +0000187 PPCCondCode;
cerion2c49e032005-02-09 17:29:49 +0000188
florian55085f82012-11-21 00:36:55 +0000189extern const HChar* showPPCCondCode ( PPCCondCode );
cerionbcf8c3e2005-02-04 16:17:07 +0000190
cerion7cf8e4e2005-02-16 16:08:17 +0000191/* constructor */
cerion5b2325f2005-12-23 00:55:09 +0000192extern PPCCondCode mk_PPCCondCode ( PPCCondTest, PPCCondFlag );
cerion7cf8e4e2005-02-16 16:08:17 +0000193
194/* false->true, true->false */
cerion5b2325f2005-12-23 00:55:09 +0000195extern PPCCondTest invertCondTest ( PPCCondTest );
cerionbcf8c3e2005-02-04 16:17:07 +0000196
cerionab9132d2005-02-15 15:46:59 +0000197
198
cerion33aa6da2005-02-16 10:25:26 +0000199
cerionbcf8c3e2005-02-04 16:17:07 +0000200/* --------- Memory address expressions (amodes). --------- */
201
202typedef
203 enum {
sewardj92923de2006-01-25 21:29:48 +0000204 Pam_IR=1, /* Immediate (signed 16-bit) + Reg */
205 Pam_RR=2 /* Reg1 + Reg2 */
cerionbcf8c3e2005-02-04 16:17:07 +0000206 }
cerion5b2325f2005-12-23 00:55:09 +0000207 PPCAModeTag;
cerionbcf8c3e2005-02-04 16:17:07 +0000208
209typedef
210 struct {
cerion5b2325f2005-12-23 00:55:09 +0000211 PPCAModeTag tag;
cerionbcf8c3e2005-02-04 16:17:07 +0000212 union {
213 struct {
214 HReg base;
sewardja5f957d2005-07-02 01:29:32 +0000215 Int index;
cerionbcf8c3e2005-02-04 16:17:07 +0000216 } IR;
217 struct {
218 HReg base;
219 HReg index;
220 } RR;
221 } Pam;
222 }
cerion5b2325f2005-12-23 00:55:09 +0000223 PPCAMode;
cerionbcf8c3e2005-02-04 16:17:07 +0000224
cerion5b2325f2005-12-23 00:55:09 +0000225extern PPCAMode* PPCAMode_IR ( Int, HReg );
226extern PPCAMode* PPCAMode_RR ( HReg, HReg );
cerionbcf8c3e2005-02-04 16:17:07 +0000227
cerion5b2325f2005-12-23 00:55:09 +0000228extern PPCAMode* dopyPPCAMode ( PPCAMode* );
cerionbcf8c3e2005-02-04 16:17:07 +0000229
cerion5b2325f2005-12-23 00:55:09 +0000230extern void ppPPCAMode ( PPCAMode* );
cerionbcf8c3e2005-02-04 16:17:07 +0000231
232
sewardjb51f0f42005-07-18 11:38:02 +0000233/* --------- Operand, which can be a reg or a u16/s16. --------- */
234/* ("RH" == "Register or Halfword immediate") */
cerionbcf8c3e2005-02-04 16:17:07 +0000235typedef
236 enum {
sewardj92923de2006-01-25 21:29:48 +0000237 Prh_Imm=3,
238 Prh_Reg=4
cerionbcf8c3e2005-02-04 16:17:07 +0000239 }
cerion5b2325f2005-12-23 00:55:09 +0000240 PPCRHTag;
sewardjb51f0f42005-07-18 11:38:02 +0000241
242typedef
243 struct {
cerion5b2325f2005-12-23 00:55:09 +0000244 PPCRHTag tag;
sewardjb51f0f42005-07-18 11:38:02 +0000245 union {
246 struct {
247 Bool syned;
248 UShort imm16;
249 } Imm;
250 struct {
251 HReg reg;
252 } Reg;
253 }
254 Prh;
255 }
cerion5b2325f2005-12-23 00:55:09 +0000256 PPCRH;
sewardjb51f0f42005-07-18 11:38:02 +0000257
cerion5b2325f2005-12-23 00:55:09 +0000258extern PPCRH* PPCRH_Imm ( Bool, UShort );
259extern PPCRH* PPCRH_Reg ( HReg );
sewardjb51f0f42005-07-18 11:38:02 +0000260
cerion5b2325f2005-12-23 00:55:09 +0000261extern void ppPPCRH ( PPCRH* );
sewardjb51f0f42005-07-18 11:38:02 +0000262
263
cerionf0de28c2005-12-13 20:21:11 +0000264/* --------- Operand, which can be a reg or a u32/64. --------- */
sewardjb51f0f42005-07-18 11:38:02 +0000265
266typedef
267 enum {
sewardj92923de2006-01-25 21:29:48 +0000268 Pri_Imm=5,
269 Pri_Reg=6
sewardjb51f0f42005-07-18 11:38:02 +0000270 }
cerion5b2325f2005-12-23 00:55:09 +0000271 PPCRITag;
cerionbcf8c3e2005-02-04 16:17:07 +0000272
273typedef
274 struct {
cerion5b2325f2005-12-23 00:55:09 +0000275 PPCRITag tag;
cerionbcf8c3e2005-02-04 16:17:07 +0000276 union {
cerionf0de28c2005-12-13 20:21:11 +0000277 ULong Imm;
278 HReg Reg;
cerionbcf8c3e2005-02-04 16:17:07 +0000279 }
280 Pri;
281 }
cerion5b2325f2005-12-23 00:55:09 +0000282 PPCRI;
cerionbcf8c3e2005-02-04 16:17:07 +0000283
cerion5b2325f2005-12-23 00:55:09 +0000284extern PPCRI* PPCRI_Imm ( ULong );
sewardj478646f2008-05-01 20:13:04 +0000285extern PPCRI* PPCRI_Reg( HReg );
cerionbcf8c3e2005-02-04 16:17:07 +0000286
cerion5b2325f2005-12-23 00:55:09 +0000287extern void ppPPCRI ( PPCRI* );
cerionbcf8c3e2005-02-04 16:17:07 +0000288
289
cerion27b3d7e2005-09-14 20:35:47 +0000290/* --------- Operand, which can be a vector reg or a s6. --------- */
291/* ("VI" == "Vector Register or Immediate") */
292typedef
293 enum {
sewardj92923de2006-01-25 21:29:48 +0000294 Pvi_Imm=7,
295 Pvi_Reg=8
cerion27b3d7e2005-09-14 20:35:47 +0000296 }
cerion5b2325f2005-12-23 00:55:09 +0000297 PPCVI5sTag;
cerion27b3d7e2005-09-14 20:35:47 +0000298
299typedef
300 struct {
cerion5b2325f2005-12-23 00:55:09 +0000301 PPCVI5sTag tag;
cerion27b3d7e2005-09-14 20:35:47 +0000302 union {
303 Char Imm5s;
304 HReg Reg;
305 }
306 Pvi;
307 }
cerion5b2325f2005-12-23 00:55:09 +0000308 PPCVI5s;
cerion27b3d7e2005-09-14 20:35:47 +0000309
cerion5b2325f2005-12-23 00:55:09 +0000310extern PPCVI5s* PPCVI5s_Imm ( Char );
311extern PPCVI5s* PPCVI5s_Reg ( HReg );
cerion27b3d7e2005-09-14 20:35:47 +0000312
cerion5b2325f2005-12-23 00:55:09 +0000313extern void ppPPCVI5s ( PPCVI5s* );
cerion27b3d7e2005-09-14 20:35:47 +0000314
315
cerioncd304492005-02-08 19:40:24 +0000316/* --------- Instructions. --------- */
cerionbcf8c3e2005-02-04 16:17:07 +0000317
cerion2c49e032005-02-09 17:29:49 +0000318/* --------- */
319typedef
320 enum {
321 Pun_NEG,
cerione13bb312005-02-10 19:51:03 +0000322 Pun_NOT,
cerion07b07a92005-12-22 14:32:35 +0000323 Pun_CLZ32,
sewardj7fd5bb02006-01-26 02:24:17 +0000324 Pun_CLZ64,
325 Pun_EXTSW
cerion2c49e032005-02-09 17:29:49 +0000326 }
cerion5b2325f2005-12-23 00:55:09 +0000327 PPCUnaryOp;
cerion2c49e032005-02-09 17:29:49 +0000328
florian55085f82012-11-21 00:36:55 +0000329extern const HChar* showPPCUnaryOp ( PPCUnaryOp );
cerioncd304492005-02-08 19:40:24 +0000330
331
332/* --------- */
333typedef
334 enum {
335 Palu_INVALID,
sewardjb51f0f42005-07-18 11:38:02 +0000336 Palu_ADD, Palu_SUB,
337 Palu_AND, Palu_OR, Palu_XOR,
cerioncd304492005-02-08 19:40:24 +0000338 }
cerion5b2325f2005-12-23 00:55:09 +0000339 PPCAluOp;
cerioncd304492005-02-08 19:40:24 +0000340
sewardjb51f0f42005-07-18 11:38:02 +0000341extern
florian55085f82012-11-21 00:36:55 +0000342const HChar* showPPCAluOp ( PPCAluOp,
343 Bool /* is the 2nd operand an immediate? */);
cerionbb01b7c2005-12-16 13:40:18 +0000344
345
346/* --------- */
347typedef
348 enum {
349 Pshft_INVALID,
350 Pshft_SHL, Pshft_SHR, Pshft_SAR,
351 }
cerion5b2325f2005-12-23 00:55:09 +0000352 PPCShftOp;
cerionbb01b7c2005-12-16 13:40:18 +0000353
354extern
florian55085f82012-11-21 00:36:55 +0000355const HChar* showPPCShftOp ( PPCShftOp,
356 Bool /* is the 2nd operand an immediate? */,
357 Bool /* is this a 32bit or 64bit op? */ );
cerionab9132d2005-02-15 15:46:59 +0000358
359
cerion094d1392005-06-20 13:45:57 +0000360/* --------- */
361typedef
362 enum {
363 Pfp_INVALID,
sewardj40c80262006-02-08 19:30:46 +0000364
365 /* Ternary */
sewardjc6bbd472012-04-02 10:20:48 +0000366 Pfp_MADDD, Pfp_MSUBD,
367 Pfp_MADDS, Pfp_MSUBS,
368 Pfp_DFPADD, Pfp_DFPADDQ,
369 Pfp_DFPSUB, Pfp_DFPSUBQ,
370 Pfp_DFPMUL, Pfp_DFPMULQ,
371 Pfp_DFPDIV, Pfp_DFPDIVQ,
372 Pfp_DQUAQ, Pfp_DRRNDQ,
sewardj40c80262006-02-08 19:30:46 +0000373
cerion094d1392005-06-20 13:45:57 +0000374 /* Binary */
sewardj26217b02012-04-12 17:19:48 +0000375 Pfp_ADDD, Pfp_SUBD, Pfp_MULD, Pfp_DIVD,
376 Pfp_ADDS, Pfp_SUBS, Pfp_MULS, Pfp_DIVS,
sewardjcdc376d2012-04-23 11:21:12 +0000377 Pfp_DRSP, Pfp_DRDPQ, Pfp_DCTFIX, Pfp_DCTFIXQ, Pfp_DCFFIX,
carllcea07cc2013-01-22 20:25:31 +0000378 Pfp_DQUA, Pfp_RRDTR, Pfp_DIEX, Pfp_DIEXQ, Pfp_DRINTN,
cerion094d1392005-06-20 13:45:57 +0000379
380 /* Unary */
sewardj0f1ef862008-08-08 08:37:06 +0000381 Pfp_SQRT, Pfp_ABS, Pfp_NEG, Pfp_MOV, Pfp_RES, Pfp_RSQRTE,
sewardj26217b02012-04-12 17:19:48 +0000382 Pfp_FRIN, Pfp_FRIM, Pfp_FRIP, Pfp_FRIZ,
sewardjcdc376d2012-04-23 11:21:12 +0000383 Pfp_DSCLI, Pfp_DSCRI, Pfp_DSCLIQ, Pfp_DSCRIQ, Pfp_DCTDP,
384 Pfp_DCTQPQ, Pfp_DCFFIXQ, Pfp_DXEX, Pfp_DXEXQ,
385
cerion094d1392005-06-20 13:45:57 +0000386 }
cerion5b2325f2005-12-23 00:55:09 +0000387 PPCFpOp;
cerion094d1392005-06-20 13:45:57 +0000388
florian55085f82012-11-21 00:36:55 +0000389extern const HChar* showPPCFpOp ( PPCFpOp );
cerionbcf8c3e2005-02-04 16:17:07 +0000390
391
392/* --------- */
393typedef
394 enum {
cerionc3d8bdc2005-06-28 18:06:23 +0000395 Pav_INVALID,
396
397 /* Integer Unary */
398 Pav_MOV, /* Mov */
399 Pav_NOT, /* Bitwise */
400 Pav_UNPCKH8S, Pav_UNPCKH16S, /* Unpack */
401 Pav_UNPCKL8S, Pav_UNPCKL16S,
402 Pav_UNPCKHPIX, Pav_UNPCKLPIX,
403
404 /* Integer Binary */
cerion8ea0d3e2005-11-14 00:44:47 +0000405 Pav_AND, Pav_OR, Pav_XOR, /* Bitwise */
cerionf34ccc42005-09-16 08:55:50 +0000406 Pav_ADDU, Pav_QADDU, Pav_QADDS,
cerionf34ccc42005-09-16 08:55:50 +0000407 Pav_SUBU, Pav_QSUBU, Pav_QSUBS,
carll48ae46b2013-10-01 15:45:54 +0000408 Pav_MULU,
cerion6b6f59e2005-06-28 20:59:18 +0000409 Pav_OMULU, Pav_OMULS, Pav_EMULU, Pav_EMULS,
cerion6b6f59e2005-06-28 20:59:18 +0000410 Pav_AVGU, Pav_AVGS,
411 Pav_MAXU, Pav_MAXS,
412 Pav_MINU, Pav_MINS,
cerionc3d8bdc2005-06-28 18:06:23 +0000413
414 /* Compare (always affects CR field 6) */
cerion6b6f59e2005-06-28 20:59:18 +0000415 Pav_CMPEQU, Pav_CMPGTU, Pav_CMPGTS,
cerionc3d8bdc2005-06-28 18:06:23 +0000416
417 /* Shift */
cerion6b6f59e2005-06-28 20:59:18 +0000418 Pav_SHL, Pav_SHR, Pav_SAR, Pav_ROTL,
cerionc3d8bdc2005-06-28 18:06:23 +0000419
420 /* Pack */
cerionf34ccc42005-09-16 08:55:50 +0000421 Pav_PACKUU, Pav_QPACKUU, Pav_QPACKSU, Pav_QPACKSS,
cerion6b6f59e2005-06-28 20:59:18 +0000422 Pav_PACKPXL,
cerionc3d8bdc2005-06-28 18:06:23 +0000423
424 /* Merge */
cerion6b6f59e2005-06-28 20:59:18 +0000425 Pav_MRGHI, Pav_MRGLO,
carll48ae46b2013-10-01 15:45:54 +0000426
427 /* Concatenation */
428 Pav_CATODD, Pav_CATEVEN,
carll7deaf952013-10-15 18:11:20 +0000429
430 /* Polynomial Multipy-Add */
431 Pav_POLYMULADD,
432
433 /* Cipher */
434 Pav_CIPHERV128, Pav_CIPHERLV128, Pav_NCIPHERV128, Pav_NCIPHERLV128,
435 Pav_CIPHERSUBV128,
436
437 /* Hash */
438 Pav_SHA256, Pav_SHA512,
439
440 /* BCD Arithmetic */
441 Pav_BCDAdd, Pav_BCDSub,
442
443 /* zero count */
444 Pav_ZEROCNTBYTE, Pav_ZEROCNTWORD, Pav_ZEROCNTHALF, Pav_ZEROCNTDBL,
carll60c6bac2013-10-18 01:19:06 +0000445
446 /* Vector bit matrix transpose by byte */
447 Pav_BITMTXXPOSE,
cerionc3d8bdc2005-06-28 18:06:23 +0000448 }
cerion5b2325f2005-12-23 00:55:09 +0000449 PPCAvOp;
cerionc3d8bdc2005-06-28 18:06:23 +0000450
florian55085f82012-11-21 00:36:55 +0000451extern const HChar* showPPCAvOp ( PPCAvOp );
cerionc3d8bdc2005-06-28 18:06:23 +0000452
453
454/* --------- */
455typedef
456 enum {
cerion8ea0d3e2005-11-14 00:44:47 +0000457 Pavfp_INVALID,
458
459 /* Floating point binary */
460 Pavfp_ADDF, Pavfp_SUBF, Pavfp_MULF,
461 Pavfp_MAXF, Pavfp_MINF,
462 Pavfp_CMPEQF, Pavfp_CMPGTF, Pavfp_CMPGEF,
463
464 /* Floating point unary */
465 Pavfp_RCPF, Pavfp_RSQRTF,
ceriond963eb42005-11-16 18:02:58 +0000466 Pavfp_CVTU2F, Pavfp_CVTS2F, Pavfp_QCVTF2U, Pavfp_QCVTF2S,
467 Pavfp_ROUNDM, Pavfp_ROUNDP, Pavfp_ROUNDN, Pavfp_ROUNDZ,
cerion8ea0d3e2005-11-14 00:44:47 +0000468 }
cerion5b2325f2005-12-23 00:55:09 +0000469 PPCAvFpOp;
cerion8ea0d3e2005-11-14 00:44:47 +0000470
florian55085f82012-11-21 00:36:55 +0000471extern const HChar* showPPCAvFpOp ( PPCAvFpOp );
cerion8ea0d3e2005-11-14 00:44:47 +0000472
473
474/* --------- */
475typedef
476 enum {
cerionf0de28c2005-12-13 20:21:11 +0000477 Pin_LI, /* load word (32/64-bit) immediate (fake insn) */
cerionbb01b7c2005-12-16 13:40:18 +0000478 Pin_Alu, /* word add/sub/and/or/xor */
479 Pin_Shft, /* word shl/shr/sar */
cerion5b2325f2005-12-23 00:55:09 +0000480 Pin_AddSubC, /* add/sub with read/write carry */
cerionf0de28c2005-12-13 20:21:11 +0000481 Pin_Cmp, /* word compare */
482 Pin_Unary, /* not, neg, clz */
cerioned623db2005-06-20 12:42:04 +0000483 Pin_MulL, /* widening multiply */
484 Pin_Div, /* div */
485 Pin_Call, /* call to address in register */
sewardj3dee8492012-04-20 00:13:28 +0000486 Pin_XDirect, /* direct transfer to GA */
487 Pin_XIndir, /* indirect transfer to GA */
488 Pin_XAssisted, /* assisted transfer to GA */
cerionf0de28c2005-12-13 20:21:11 +0000489 Pin_CMov, /* conditional move */
sewardj7fd5bb02006-01-26 02:24:17 +0000490 Pin_Load, /* zero-extending load a 8|16|32|64 bit value from mem */
sewardje9d8a262009-07-01 08:06:34 +0000491 Pin_LoadL, /* load-linked (lwarx/ldarx) 32|64 bit value from mem */
cerion5b2325f2005-12-23 00:55:09 +0000492 Pin_Store, /* store a 8|16|32|64 bit value to mem */
sewardje9d8a262009-07-01 08:06:34 +0000493 Pin_StoreC, /* store-conditional (stwcx./stdcx.) 32|64 bit val */
cerion5b2325f2005-12-23 00:55:09 +0000494 Pin_Set, /* convert condition code to value 0 or 1 */
sewardjb51f0f42005-07-18 11:38:02 +0000495 Pin_MfCR, /* move from condition register to GPR */
496 Pin_MFence, /* mem fence */
cerionc3d8bdc2005-06-28 18:06:23 +0000497
cerion094d1392005-06-20 13:45:57 +0000498 Pin_FpUnary, /* FP unary op */
499 Pin_FpBinary, /* FP binary op */
sewardj40c80262006-02-08 19:30:46 +0000500 Pin_FpMulAcc, /* FP multipy-accumulate style op */
cerion094d1392005-06-20 13:45:57 +0000501 Pin_FpLdSt, /* FP load/store */
sewardj92923de2006-01-25 21:29:48 +0000502 Pin_FpSTFIW, /* stfiwx */
503 Pin_FpRSP, /* FP round IEEE754 double to IEEE754 single */
sewardj7d810d72011-05-08 22:05:10 +0000504 Pin_FpCftI, /* fcfid[u,s,us]/fctid[u]/fctiw[u] */
cerion094d1392005-06-20 13:45:57 +0000505 Pin_FpCMov, /* FP floating point conditional move */
506 Pin_FpLdFPSCR, /* mtfsf */
507 Pin_FpCmp, /* FP compare, generating value into int reg */
sewardj92923de2006-01-25 21:29:48 +0000508
cerionc3d8bdc2005-06-28 18:06:23 +0000509 Pin_RdWrLR, /* Read/Write Link Register */
510
cerionc3d8bdc2005-06-28 18:06:23 +0000511 Pin_AvLdSt, /* AV load/store (kludging for AMode_IR) */
512 Pin_AvUnary, /* AV unary general reg=>reg */
cerion6b6f59e2005-06-28 20:59:18 +0000513
cerionc3d8bdc2005-06-28 18:06:23 +0000514 Pin_AvBinary, /* AV binary general reg,reg=>reg */
cerion6b6f59e2005-06-28 20:59:18 +0000515 Pin_AvBin8x16, /* AV binary, 8x4 */
516 Pin_AvBin16x8, /* AV binary, 16x4 */
517 Pin_AvBin32x4, /* AV binary, 32x4 */
carll0c74bb52013-08-12 18:01:40 +0000518 Pin_AvBin64x2, /* AV binary, 64x2 */
cerion6b6f59e2005-06-28 20:59:18 +0000519
520 Pin_AvBin32Fx4, /* AV FP binary, 32Fx4 */
cerion8ea0d3e2005-11-14 00:44:47 +0000521 Pin_AvUn32Fx4, /* AV FP unary, 32Fx4 */
cerionc3d8bdc2005-06-28 18:06:23 +0000522
523 Pin_AvPerm, /* AV permute (shuffle) */
524 Pin_AvSel, /* AV select */
carll9877fe52014-10-07 17:49:14 +0000525 Pin_AvSh, /* AV shift left or right */
cerionc3d8bdc2005-06-28 18:06:23 +0000526 Pin_AvShlDbl, /* AV shift-left double by imm */
527 Pin_AvSplat, /* One elem repeated throughout dst */
cerion6b6f59e2005-06-28 20:59:18 +0000528 Pin_AvLdVSCR, /* mtvscr */
sewardjc6bbd472012-04-02 10:20:48 +0000529 Pin_AvCMov, /* AV conditional move */
carll7deaf952013-10-15 18:11:20 +0000530 Pin_AvCipherV128Unary, /* AV Vector unary Cipher */
531 Pin_AvCipherV128Binary, /* AV Vector binary Cipher */
532 Pin_AvHashV128Binary, /* AV Vector binary Hash */
533 Pin_AvBCDV128Trinary, /* BCD Arithmetic */
sewardjc6bbd472012-04-02 10:20:48 +0000534 Pin_Dfp64Unary, /* DFP64 unary op */
sewardj26217b02012-04-12 17:19:48 +0000535 Pin_Dfp128Unary, /* DFP128 unary op */
536 Pin_DfpShift, /* Decimal floating point shift by immediate value */
sewardjc6bbd472012-04-02 10:20:48 +0000537 Pin_Dfp64Binary, /* DFP64 binary op */
sewardj26217b02012-04-12 17:19:48 +0000538 Pin_Dfp128Binary, /* DFP128 binary op */
539 Pin_DfpShift128, /* 128-bit Decimal floating point shift by
540 * immediate value */
541 Pin_DfpD128toD64, /* DFP 128 to DFP 64 op */
542 Pin_DfpI64StoD128, /* DFP signed integer to DFP 128 */
sewardjcdc376d2012-04-23 11:21:12 +0000543 Pin_DfpRound, /* D64 round to D64 */
544 Pin_DfpRound128, /* D128 round to D128 */
545 Pin_ExtractExpD128, /* DFP, extract 64 bit exponent */
546 Pin_InsertExpD128, /* DFP, insert 64 bit exponent and 128 bit binary
547 * significand into a DFP 128-bit value*/
548 Pin_Dfp64Cmp, /* DFP 64-bit compare, generating value into
549 * int reg */
550 Pin_Dfp128Cmp, /* DFP 128-bit compare, generating value into
551 * int reg */
552 Pin_DfpQuantize, /* D64 quantize using register value, significance
553 * round */
554 Pin_DfpQuantize128, /* D128 quantize using register value, significance
555 * round */
sewardj3dee8492012-04-20 00:13:28 +0000556 Pin_EvCheck, /* Event check */
557 Pin_ProfInc /* 64-bit profile counter increment */
cerionbcf8c3e2005-02-04 16:17:07 +0000558 }
cerion5b2325f2005-12-23 00:55:09 +0000559 PPCInstrTag;
cerionbcf8c3e2005-02-04 16:17:07 +0000560
cerioncd304492005-02-08 19:40:24 +0000561/* Destinations are on the LEFT (first operand) */
cerionbcf8c3e2005-02-04 16:17:07 +0000562
563typedef
564 struct {
cerion5b2325f2005-12-23 00:55:09 +0000565 PPCInstrTag tag;
cerioncd304492005-02-08 19:40:24 +0000566 union {
cerion5b2325f2005-12-23 00:55:09 +0000567 /* Get a 32/64-bit literal into a register.
568 May turn into a number of real insns. */
sewardjb51f0f42005-07-18 11:38:02 +0000569 struct {
570 HReg dst;
cerionf0de28c2005-12-13 20:21:11 +0000571 ULong imm64;
572 } LI;
cerionbb01b7c2005-12-16 13:40:18 +0000573 /* Integer add/sub/and/or/xor. Limitations:
sewardjb51f0f42005-07-18 11:38:02 +0000574 - For add, the immediate, if it exists, is a signed 16.
575 - For sub, the immediate, if it exists, is a signed 16
576 which may not be -32768, since no such instruction
577 exists, and so we have to emit addi with +32768, but
578 that is not possible.
579 - For and/or/xor, the immediate, if it exists,
580 is an unsigned 16.
sewardjb51f0f42005-07-18 11:38:02 +0000581 */
cerioncd304492005-02-08 19:40:24 +0000582 struct {
cerion5b2325f2005-12-23 00:55:09 +0000583 PPCAluOp op;
584 HReg dst;
585 HReg srcL;
586 PPCRH* srcR;
cerionf0de28c2005-12-13 20:21:11 +0000587 } Alu;
cerionbb01b7c2005-12-16 13:40:18 +0000588 /* Integer shl/shr/sar.
589 Limitations: the immediate, if it exists,
590 is a signed 5-bit value between 1 and 31 inclusive.
591 */
592 struct {
cerion5b2325f2005-12-23 00:55:09 +0000593 PPCShftOp op;
594 Bool sz32; /* mode64 has both 32 and 64bit shft */
595 HReg dst;
596 HReg srcL;
597 PPCRH* srcR;
cerionbb01b7c2005-12-16 13:40:18 +0000598 } Shft;
cerion4a49b032005-11-08 16:23:07 +0000599 /* */
600 struct {
601 Bool isAdd; /* else sub */
602 Bool setC; /* else read carry */
603 HReg dst;
604 HReg srcL;
605 HReg srcR;
cerion5b2325f2005-12-23 00:55:09 +0000606 } AddSubC;
sewardjb51f0f42005-07-18 11:38:02 +0000607 /* If signed, the immediate, if it exists, is a signed 16,
608 else it is an unsigned 16. */
cerioncd304492005-02-08 19:40:24 +0000609 struct {
cerion5b2325f2005-12-23 00:55:09 +0000610 Bool syned;
611 Bool sz32; /* mode64 has both 32 and 64bit cmp */
612 UInt crfD;
613 HReg srcL;
614 PPCRH* srcR;
cerionf0de28c2005-12-13 20:21:11 +0000615 } Cmp;
sewardj7fd5bb02006-01-26 02:24:17 +0000616 /* Not, Neg, Clz32/64, Extsw */
cerion2c49e032005-02-09 17:29:49 +0000617 struct {
cerion5b2325f2005-12-23 00:55:09 +0000618 PPCUnaryOp op;
619 HReg dst;
620 HReg src;
621 } Unary;
cerion92f5dc72005-02-10 16:11:35 +0000622 struct {
sewardjb51f0f42005-07-18 11:38:02 +0000623 Bool syned; /* meaningless if hi32==False */
cerionf0de28c2005-12-13 20:21:11 +0000624 Bool hi; /* False=>low, True=>high */
cerionbb01b7c2005-12-16 13:40:18 +0000625 Bool sz32; /* mode64 has both 32 & 64bit mull */
sewardjb51f0f42005-07-18 11:38:02 +0000626 HReg dst;
627 HReg srcL;
628 HReg srcR;
cerion92f5dc72005-02-10 16:11:35 +0000629 } MulL;
cerion9e263e32005-03-03 17:21:51 +0000630 /* ppc32 div/divu instruction. */
cerionc0e707e2005-02-10 22:35:34 +0000631 struct {
sewardj4aa412a2011-07-24 14:13:21 +0000632 Bool extended;
cerion33aa6da2005-02-16 10:25:26 +0000633 Bool syned;
cerionbb01b7c2005-12-16 13:40:18 +0000634 Bool sz32; /* mode64 has both 32 & 64bit div */
cerion33aa6da2005-02-16 10:25:26 +0000635 HReg dst;
ceriona2f75882005-03-15 16:33:38 +0000636 HReg srcL;
637 HReg srcR;
cerionc0e707e2005-02-10 22:35:34 +0000638 } Div;
cerion2c49e032005-02-09 17:29:49 +0000639 /* Pseudo-insn. Call target (an absolute address), on given
sewardj6a64a9f2005-08-21 00:48:37 +0000640 condition (which could be Pct_ALWAYS). argiregs indicates
641 which of r3 .. r10 carries argument values for this call,
642 using a bit mask (1<<N is set if rN holds an arg, for N in
643 3 .. 10 inclusive). */
cerion2c49e032005-02-09 17:29:49 +0000644 struct {
cerion5b2325f2005-12-23 00:55:09 +0000645 PPCCondCode cond;
646 Addr64 target;
647 UInt argiregs;
sewardjcfe046e2013-01-17 14:23:53 +0000648 RetLoc rloc; /* where the return value will be */
cerion2c49e032005-02-09 17:29:49 +0000649 } Call;
sewardj3dee8492012-04-20 00:13:28 +0000650 /* Update the guest CIA value, then exit requesting to chain
651 to it. May be conditional. Use of Addr64 in order to cope
652 with 64-bit hosts. */
cerion2c49e032005-02-09 17:29:49 +0000653 struct {
sewardj3dee8492012-04-20 00:13:28 +0000654 Addr64 dstGA; /* next guest address */
655 PPCAMode* amCIA; /* amode in guest state for CIA */
656 PPCCondCode cond; /* can be ALWAYS */
657 Bool toFastEP; /* chain to the slow or fast point? */
658 } XDirect;
659 /* Boring transfer to a guest address not known at JIT time.
660 Not chainable. May be conditional. */
661 struct {
662 HReg dstGA;
663 PPCAMode* amCIA;
664 PPCCondCode cond; /* can be ALWAYS */
665 } XIndir;
666 /* Assisted transfer to a guest address, most general case.
667 Not chainable. May be conditional. */
668 struct {
669 HReg dstGA;
670 PPCAMode* amCIA;
671 PPCCondCode cond; /* can be ALWAYS */
cerion5b2325f2005-12-23 00:55:09 +0000672 IRJumpKind jk;
sewardj3dee8492012-04-20 00:13:28 +0000673 } XAssisted;
cerionb536af92005-02-10 15:03:19 +0000674 /* Mov src to dst on the given condition, which may not
cerion9abfcbc2005-02-25 11:16:58 +0000675 be the bogus Pct_ALWAYS. */
cerionb536af92005-02-10 15:03:19 +0000676 struct {
cerion5b2325f2005-12-23 00:55:09 +0000677 PPCCondCode cond;
cerioncd304492005-02-08 19:40:24 +0000678 HReg dst;
cerion5b2325f2005-12-23 00:55:09 +0000679 PPCRI* src;
680 } CMov;
sewardj7fd5bb02006-01-26 02:24:17 +0000681 /* Zero extending loads. Dst size is host word size */
cerion5b2325f2005-12-23 00:55:09 +0000682 struct {
683 UChar sz; /* 1|2|4|8 */
cerion5b2325f2005-12-23 00:55:09 +0000684 HReg dst;
685 PPCAMode* src;
cerion7cf8e4e2005-02-16 16:08:17 +0000686 } Load;
sewardje9d8a262009-07-01 08:06:34 +0000687 /* Load-and-reserve (lwarx, ldarx) */
688 struct {
689 UChar sz; /* 4|8 */
690 HReg dst;
691 HReg src;
692 } LoadL;
cerion5b2325f2005-12-23 00:55:09 +0000693 /* 64/32/16/8 bit stores */
cerioncd304492005-02-08 19:40:24 +0000694 struct {
cerion5b2325f2005-12-23 00:55:09 +0000695 UChar sz; /* 1|2|4|8 */
696 PPCAMode* dst;
697 HReg src;
cerioncd304492005-02-08 19:40:24 +0000698 } Store;
sewardje9d8a262009-07-01 08:06:34 +0000699 /* Store-conditional (stwcx., stdcx.) */
700 struct {
701 UChar sz; /* 4|8 */
702 HReg dst;
703 HReg src;
704 } StoreC;
cerion5b2325f2005-12-23 00:55:09 +0000705 /* Convert a ppc condition code to value 0 or 1. */
cerionb536af92005-02-10 15:03:19 +0000706 struct {
cerion5b2325f2005-12-23 00:55:09 +0000707 PPCCondCode cond;
708 HReg dst;
709 } Set;
sewardjb51f0f42005-07-18 11:38:02 +0000710 /* Move the entire CR to a GPR */
711 struct {
712 HReg dst;
713 } MfCR;
cerion98411db2005-02-16 14:14:49 +0000714 /* Mem fence. In short, an insn which flushes all preceding
715 loads and stores as much as possible before continuing.
cerion5b2325f2005-12-23 00:55:09 +0000716 On PPC we emit a "sync". */
cerion92f5dc72005-02-10 16:11:35 +0000717 struct {
cerion92f5dc72005-02-10 16:11:35 +0000718 } MFence;
cerioncd304492005-02-08 19:40:24 +0000719
cerion5b2325f2005-12-23 00:55:09 +0000720 /* PPC Floating point */
cerion094d1392005-06-20 13:45:57 +0000721 struct {
cerion5b2325f2005-12-23 00:55:09 +0000722 PPCFpOp op;
723 HReg dst;
724 HReg src;
cerion094d1392005-06-20 13:45:57 +0000725 } FpUnary;
726 struct {
cerion5b2325f2005-12-23 00:55:09 +0000727 PPCFpOp op;
728 HReg dst;
729 HReg srcL;
730 HReg srcR;
cerion094d1392005-06-20 13:45:57 +0000731 } FpBinary;
732 struct {
sewardj40c80262006-02-08 19:30:46 +0000733 PPCFpOp op;
734 HReg dst;
735 HReg srcML;
736 HReg srcMR;
737 HReg srcAcc;
738 } FpMulAcc;
739 struct {
cerion5b2325f2005-12-23 00:55:09 +0000740 Bool isLoad;
741 UChar sz; /* only 4 (IEEE single) or 8 (IEEE double) */
742 HReg reg;
743 PPCAMode* addr;
cerion094d1392005-06-20 13:45:57 +0000744 } FpLdSt;
sewardj92923de2006-01-25 21:29:48 +0000745 struct {
746 HReg addr; /* int reg */
747 HReg data; /* float reg */
748 } FpSTFIW;
749 /* Round 64-bit FP value to 32-bit FP value in an FP reg. */
cerion094d1392005-06-20 13:45:57 +0000750 struct {
751 HReg src;
752 HReg dst;
sewardj92923de2006-01-25 21:29:48 +0000753 } FpRSP;
sewardj7d810d72011-05-08 22:05:10 +0000754 /* fcfid[u,s,us]/fctid[u]/fctiw[u]. Only some combinations
755 of the various fields are allowed. This is asserted for
756 and documented in the code for the constructor,
757 PPCInstr_FpCftI, in host_ppc_defs.c. */
cerion094d1392005-06-20 13:45:57 +0000758 struct {
sewardj7d810d72011-05-08 22:05:10 +0000759 Bool fromI; /* True== I->F, False== F->I */
760 Bool int32; /* True== I is 32, False== I is 64 */
sewardj66d5ef22011-04-15 11:55:00 +0000761 Bool syned;
sewardj7d810d72011-05-08 22:05:10 +0000762 Bool flt64; /* True== F is 64, False== F is 32 */
cerion094d1392005-06-20 13:45:57 +0000763 HReg src;
764 HReg dst;
sewardj92923de2006-01-25 21:29:48 +0000765 } FpCftI;
766 /* FP mov src to dst on the given condition. */
cerion094d1392005-06-20 13:45:57 +0000767 struct {
cerion5b2325f2005-12-23 00:55:09 +0000768 PPCCondCode cond;
769 HReg dst;
770 HReg src;
cerion094d1392005-06-20 13:45:57 +0000771 } FpCMov;
772 /* Load FP Status & Control Register */
773 struct {
774 HReg src;
sewardjc6bbd472012-04-02 10:20:48 +0000775 UInt dfp_rm;
cerion094d1392005-06-20 13:45:57 +0000776 } FpLdFPSCR;
sewardjb51f0f42005-07-18 11:38:02 +0000777 /* Do a compare, generating result into an int register. */
cerion094d1392005-06-20 13:45:57 +0000778 struct {
779 UChar crfD;
780 HReg dst;
781 HReg srcL;
782 HReg srcR;
783 } FpCmp;
cerioncd304492005-02-08 19:40:24 +0000784
cerion7f000af2005-02-22 20:36:49 +0000785 /* Read/Write Link Register */
786 struct {
787 Bool wrLR;
788 HReg gpr;
789 } RdWrLR;
cerionc3d8bdc2005-06-28 18:06:23 +0000790
791 /* Simplistic AltiVec */
792 struct {
cerion5b2325f2005-12-23 00:55:09 +0000793 Bool isLoad;
794 UChar sz; /* 8|16|32|128 */
795 HReg reg;
796 PPCAMode* addr;
cerionc3d8bdc2005-06-28 18:06:23 +0000797 } AvLdSt;
798 struct {
cerion5b2325f2005-12-23 00:55:09 +0000799 PPCAvOp op;
800 HReg dst;
801 HReg src;
cerionc3d8bdc2005-06-28 18:06:23 +0000802 } AvUnary;
803 struct {
cerion5b2325f2005-12-23 00:55:09 +0000804 PPCAvOp op;
805 HReg dst;
806 HReg srcL;
807 HReg srcR;
cerionc3d8bdc2005-06-28 18:06:23 +0000808 } AvBinary;
cerion6b6f59e2005-06-28 20:59:18 +0000809 struct {
cerion5b2325f2005-12-23 00:55:09 +0000810 PPCAvOp op;
811 HReg dst;
812 HReg srcL;
813 HReg srcR;
cerion6b6f59e2005-06-28 20:59:18 +0000814 } AvBin8x16;
815 struct {
cerion5b2325f2005-12-23 00:55:09 +0000816 PPCAvOp op;
817 HReg dst;
818 HReg srcL;
819 HReg srcR;
cerion6b6f59e2005-06-28 20:59:18 +0000820 } AvBin16x8;
821 struct {
cerion5b2325f2005-12-23 00:55:09 +0000822 PPCAvOp op;
823 HReg dst;
824 HReg srcL;
825 HReg srcR;
cerion6b6f59e2005-06-28 20:59:18 +0000826 } AvBin32x4;
carll0c74bb52013-08-12 18:01:40 +0000827 /* Can only be generated for CPUs capable of ISA 2.07 or above */
828 struct {
829 PPCAvOp op;
830 HReg dst;
831 HReg srcL;
832 HReg srcR;
833 } AvBin64x2;
cerion6b6f59e2005-06-28 20:59:18 +0000834 struct {
cerion5b2325f2005-12-23 00:55:09 +0000835 PPCAvFpOp op;
cerion6b6f59e2005-06-28 20:59:18 +0000836 HReg dst;
837 HReg srcL;
838 HReg srcR;
839 } AvBin32Fx4;
cerion8ea0d3e2005-11-14 00:44:47 +0000840 struct {
cerion5b2325f2005-12-23 00:55:09 +0000841 PPCAvFpOp op;
cerion8ea0d3e2005-11-14 00:44:47 +0000842 HReg dst;
843 HReg src;
844 } AvUn32Fx4;
cerionc3d8bdc2005-06-28 18:06:23 +0000845 /* Perm,Sel,SlDbl,Splat are all weird AV permutations */
846 struct {
cerionc3d8bdc2005-06-28 18:06:23 +0000847 HReg dst;
848 HReg srcL;
849 HReg srcR;
cerion92d9d872005-09-15 21:58:50 +0000850 HReg ctl;
cerionc3d8bdc2005-06-28 18:06:23 +0000851 } AvPerm;
852 struct {
cerionc3d8bdc2005-06-28 18:06:23 +0000853 HReg dst;
854 HReg srcL;
855 HReg srcR;
cerion92d9d872005-09-15 21:58:50 +0000856 HReg ctl;
cerionc3d8bdc2005-06-28 18:06:23 +0000857 } AvSel;
858 struct {
carll9877fe52014-10-07 17:49:14 +0000859 Bool shLeft;
860 HReg dst;
carll99de41e2014-10-07 18:20:39 +0000861 PPCAMode* addr;
carll9877fe52014-10-07 17:49:14 +0000862 } AvSh;
863 struct {
cerionc3d8bdc2005-06-28 18:06:23 +0000864 UChar shift;
865 HReg dst;
866 HReg srcL;
867 HReg srcR;
868 } AvShlDbl;
869 struct {
870 UChar sz; /* 8,16,32 */
871 HReg dst;
cerion5b2325f2005-12-23 00:55:09 +0000872 PPCVI5s* src;
cerionc3d8bdc2005-06-28 18:06:23 +0000873 } AvSplat;
cerion6b6f59e2005-06-28 20:59:18 +0000874 /* Mov src to dst on the given condition, which may not
875 be the bogus Xcc_ALWAYS. */
876 struct {
cerion5b2325f2005-12-23 00:55:09 +0000877 PPCCondCode cond;
878 HReg dst;
879 HReg src;
cerion6b6f59e2005-06-28 20:59:18 +0000880 } AvCMov;
sewardjb51f0f42005-07-18 11:38:02 +0000881 /* Load AltiVec Status & Control Register */
cerionc3d8bdc2005-06-28 18:06:23 +0000882 struct {
883 HReg src;
884 } AvLdVSCR;
sewardjc6bbd472012-04-02 10:20:48 +0000885 struct {
carll7deaf952013-10-15 18:11:20 +0000886 PPCAvOp op;
887 HReg dst;
888 HReg src;
889 } AvCipherV128Unary;
890 struct {
891 PPCAvOp op;
892 HReg dst;
893 HReg src;
894 PPCRI* s_field;
895 } AvHashV128Binary;
896 struct {
897 PPCAvOp op;
898 HReg dst;
899 HReg src1;
900 HReg src2;
901 PPCRI* ps;
902 } AvBCDV128Trinary;
903 struct {
904 PPCAvOp op;
905 HReg dst;
906 HReg srcL;
907 HReg srcR;
908 } AvCipherV128Binary;
909 struct {
sewardjc6bbd472012-04-02 10:20:48 +0000910 PPCFpOp op;
911 HReg dst;
912 HReg src;
913 } Dfp64Unary;
914 struct {
915 PPCFpOp op;
916 HReg dst;
917 HReg srcL;
918 HReg srcR;
919 } Dfp64Binary;
920 struct {
921 PPCFpOp op;
sewardj26217b02012-04-12 17:19:48 +0000922 HReg dst;
923 HReg src;
924 PPCRI* shift;
925 } DfpShift;
926 struct {
927 PPCFpOp op;
sewardjc6bbd472012-04-02 10:20:48 +0000928 HReg dst_hi;
929 HReg dst_lo;
930 HReg src_hi;
931 HReg src_lo;
932 } Dfp128Unary;
933 struct {
934 /* The dst is used to pass the left source operand in and return
935 * the result.
936 */
937 PPCFpOp op;
938 HReg dst_hi;
939 HReg dst_lo;
940 HReg srcR_hi;
941 HReg srcR_lo;
942 } Dfp128Binary;
sewardj26217b02012-04-12 17:19:48 +0000943 struct {
944 PPCFpOp op;
945 HReg dst_hi;
946 HReg dst_lo;
947 HReg src_hi;
948 HReg src_lo;
949 PPCRI* shift;
950 } DfpShift128;
951 struct {
sewardjcdc376d2012-04-23 11:21:12 +0000952 HReg dst;
953 HReg src;
954 PPCRI* r_rmc;
955 } DfpRound;
956 struct {
957 HReg dst_hi;
958 HReg dst_lo;
959 HReg src_hi;
960 HReg src_lo;
961 PPCRI* r_rmc;
962 } DfpRound128;
963 struct {
964 PPCFpOp op;
965 HReg dst;
966 HReg srcL;
967 HReg srcR;
968 PPCRI* rmc;
969 } DfpQuantize;
970 struct {
971 PPCFpOp op;
972 HReg dst_hi;
973 HReg dst_lo;
974 HReg src_hi;
975 HReg src_lo;
976 PPCRI* rmc;
977 } DfpQuantize128;
978 struct {
979 PPCFpOp op;
980 HReg dst;
981 HReg src_hi;
982 HReg src_lo;
983 } ExtractExpD128;
984 struct {
985 PPCFpOp op;
986 HReg dst_hi;
987 HReg dst_lo;
988 HReg srcL;
989 HReg srcR_hi;
990 HReg srcR_lo;
991 } InsertExpD128;
992 struct {
sewardj26217b02012-04-12 17:19:48 +0000993 PPCFpOp op;
994 HReg dst;
995 HReg src_hi;
996 HReg src_lo;
997 } DfpD128toD64;
998 struct {
999 PPCFpOp op;
1000 HReg dst_hi;
1001 HReg dst_lo;
1002 HReg src;
1003 } DfpI64StoD128;
sewardj3dee8492012-04-20 00:13:28 +00001004 struct {
sewardjcdc376d2012-04-23 11:21:12 +00001005 UChar crfD;
1006 HReg dst;
1007 HReg srcL;
1008 HReg srcR;
1009 } Dfp64Cmp;
1010 struct {
1011 UChar crfD;
1012 HReg dst;
1013 HReg srcL_hi;
1014 HReg srcL_lo;
1015 HReg srcR_hi;
1016 HReg srcR_lo;
1017 } Dfp128Cmp;
1018 struct {
sewardj3dee8492012-04-20 00:13:28 +00001019 PPCAMode* amCounter;
1020 PPCAMode* amFailAddr;
1021 } EvCheck;
1022 struct {
1023 /* No fields. The address of the counter to inc is
1024 installed later, post-translation, by patching it in,
1025 as it is not known at translation time. */
1026 } ProfInc;
sewardjc6bbd472012-04-02 10:20:48 +00001027 } Pin;
cerionbcf8c3e2005-02-04 16:17:07 +00001028 }
cerion5b2325f2005-12-23 00:55:09 +00001029 PPCInstr;
cerionbcf8c3e2005-02-04 16:17:07 +00001030
cerioncd304492005-02-08 19:40:24 +00001031
cerion5b2325f2005-12-23 00:55:09 +00001032extern PPCInstr* PPCInstr_LI ( HReg, ULong, Bool );
1033extern PPCInstr* PPCInstr_Alu ( PPCAluOp, HReg, HReg, PPCRH* );
1034extern PPCInstr* PPCInstr_Shft ( PPCShftOp, Bool sz32, HReg, HReg, PPCRH* );
1035extern PPCInstr* PPCInstr_AddSubC ( Bool, Bool, HReg, HReg, HReg );
1036extern PPCInstr* PPCInstr_Cmp ( Bool, Bool, UInt, HReg, PPCRH* );
1037extern PPCInstr* PPCInstr_Unary ( PPCUnaryOp op, HReg dst, HReg src );
1038extern PPCInstr* PPCInstr_MulL ( Bool syned, Bool hi32, Bool sz32, HReg, HReg, HReg );
sewardj4aa412a2011-07-24 14:13:21 +00001039extern PPCInstr* PPCInstr_Div ( Bool extended, Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR );
sewardjcfe046e2013-01-17 14:23:53 +00001040extern PPCInstr* PPCInstr_Call ( PPCCondCode, Addr64, UInt, RetLoc );
sewardj3dee8492012-04-20 00:13:28 +00001041extern PPCInstr* PPCInstr_XDirect ( Addr64 dstGA, PPCAMode* amCIA,
1042 PPCCondCode cond, Bool toFastEP );
1043extern PPCInstr* PPCInstr_XIndir ( HReg dstGA, PPCAMode* amCIA,
1044 PPCCondCode cond );
1045extern PPCInstr* PPCInstr_XAssisted ( HReg dstGA, PPCAMode* amCIA,
1046 PPCCondCode cond, IRJumpKind jk );
cerion5b2325f2005-12-23 00:55:09 +00001047extern PPCInstr* PPCInstr_CMov ( PPCCondCode, HReg dst, PPCRI* src );
sewardj7fd5bb02006-01-26 02:24:17 +00001048extern PPCInstr* PPCInstr_Load ( UChar sz,
cerion5b2325f2005-12-23 00:55:09 +00001049 HReg dst, PPCAMode* src, Bool mode64 );
sewardje9d8a262009-07-01 08:06:34 +00001050extern PPCInstr* PPCInstr_LoadL ( UChar sz,
1051 HReg dst, HReg src, Bool mode64 );
cerion5b2325f2005-12-23 00:55:09 +00001052extern PPCInstr* PPCInstr_Store ( UChar sz, PPCAMode* dst,
1053 HReg src, Bool mode64 );
sewardje9d8a262009-07-01 08:06:34 +00001054extern PPCInstr* PPCInstr_StoreC ( UChar sz, HReg dst, HReg src,
1055 Bool mode64 );
cerion5b2325f2005-12-23 00:55:09 +00001056extern PPCInstr* PPCInstr_Set ( PPCCondCode cond, HReg dst );
1057extern PPCInstr* PPCInstr_MfCR ( HReg dst );
1058extern PPCInstr* PPCInstr_MFence ( void );
cerioned623db2005-06-20 12:42:04 +00001059
cerion5b2325f2005-12-23 00:55:09 +00001060extern PPCInstr* PPCInstr_FpUnary ( PPCFpOp op, HReg dst, HReg src );
1061extern PPCInstr* PPCInstr_FpBinary ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR );
sewardj40c80262006-02-08 19:30:46 +00001062extern PPCInstr* PPCInstr_FpMulAcc ( PPCFpOp op, HReg dst, HReg srcML,
1063 HReg srcMR, HReg srcAcc );
cerion5b2325f2005-12-23 00:55:09 +00001064extern PPCInstr* PPCInstr_FpLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* );
sewardj92923de2006-01-25 21:29:48 +00001065extern PPCInstr* PPCInstr_FpSTFIW ( HReg addr, HReg data );
1066extern PPCInstr* PPCInstr_FpRSP ( HReg dst, HReg src );
sewardj66d5ef22011-04-15 11:55:00 +00001067extern PPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned,
1068 Bool dst64, HReg dst, HReg src );
cerion5b2325f2005-12-23 00:55:09 +00001069extern PPCInstr* PPCInstr_FpCMov ( PPCCondCode, HReg dst, HReg src );
sewardjc6bbd472012-04-02 10:20:48 +00001070extern PPCInstr* PPCInstr_FpLdFPSCR ( HReg src, Bool dfp_rm );
cerion5b2325f2005-12-23 00:55:09 +00001071extern PPCInstr* PPCInstr_FpCmp ( HReg dst, HReg srcL, HReg srcR );
cerionbcf8c3e2005-02-04 16:17:07 +00001072
cerion5b2325f2005-12-23 00:55:09 +00001073extern PPCInstr* PPCInstr_RdWrLR ( Bool wrLR, HReg gpr );
cerion7f000af2005-02-22 20:36:49 +00001074
cerion5b2325f2005-12-23 00:55:09 +00001075extern PPCInstr* PPCInstr_AvLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* );
1076extern PPCInstr* PPCInstr_AvUnary ( PPCAvOp op, HReg dst, HReg src );
1077extern PPCInstr* PPCInstr_AvBinary ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1078extern PPCInstr* PPCInstr_AvBin8x16 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1079extern PPCInstr* PPCInstr_AvBin16x8 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1080extern PPCInstr* PPCInstr_AvBin32x4 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
carll0c74bb52013-08-12 18:01:40 +00001081extern PPCInstr* PPCInstr_AvBin64x2 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
sewardje522d4b2011-04-26 21:36:09 +00001082extern PPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, HReg srcL, HReg srcR );
1083extern PPCInstr* PPCInstr_AvUn32Fx4 ( PPCAvFpOp op, HReg dst, HReg src );
cerion5b2325f2005-12-23 00:55:09 +00001084extern PPCInstr* PPCInstr_AvPerm ( HReg dst, HReg srcL, HReg srcR, HReg ctl );
1085extern PPCInstr* PPCInstr_AvSel ( HReg ctl, HReg dst, HReg srcL, HReg srcR );
carll9877fe52014-10-07 17:49:14 +00001086extern PPCInstr* PPCInstr_AvSh ( Bool shLeft, HReg dst, PPCAMode* am_addr );
cerion5b2325f2005-12-23 00:55:09 +00001087extern PPCInstr* PPCInstr_AvShlDbl ( UChar shift, HReg dst, HReg srcL, HReg srcR );
1088extern PPCInstr* PPCInstr_AvSplat ( UChar sz, HReg dst, PPCVI5s* src );
1089extern PPCInstr* PPCInstr_AvCMov ( PPCCondCode, HReg dst, HReg src );
1090extern PPCInstr* PPCInstr_AvLdVSCR ( HReg src );
carll7deaf952013-10-15 18:11:20 +00001091extern PPCInstr* PPCInstr_AvCipherV128Unary ( PPCAvOp op, HReg dst,
1092 HReg srcR );
1093extern PPCInstr* PPCInstr_AvCipherV128Binary ( PPCAvOp op, HReg dst,
1094 HReg srcL, HReg srcR );
1095extern PPCInstr* PPCInstr_AvHashV128Binary ( PPCAvOp op, HReg dst,
1096 HReg src, PPCRI* s_field );
1097extern PPCInstr* PPCInstr_AvBCDV128Trinary ( PPCAvOp op, HReg dst,
1098 HReg src1, HReg src2,
1099 PPCRI* ps );
sewardjc6bbd472012-04-02 10:20:48 +00001100extern PPCInstr* PPCInstr_Dfp64Unary ( PPCFpOp op, HReg dst, HReg src );
1101extern PPCInstr* PPCInstr_Dfp64Binary ( PPCFpOp op, HReg dst, HReg srcL,
1102 HReg srcR );
sewardj26217b02012-04-12 17:19:48 +00001103extern PPCInstr* PPCInstr_DfpShift ( PPCFpOp op, HReg dst, HReg src,
sewardjcdc376d2012-04-23 11:21:12 +00001104 PPCRI* shift );
sewardj26217b02012-04-12 17:19:48 +00001105extern PPCInstr* PPCInstr_Dfp128Unary ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1106 HReg srcR_hi, HReg srcR_lo );
1107extern PPCInstr* PPCInstr_Dfp128Binary ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1108 HReg srcR_hi, HReg srcR_lo );
1109extern PPCInstr* PPCInstr_DfpShift128 ( PPCFpOp op, HReg dst_hi, HReg src_hi,
1110 HReg dst_lo, HReg src_lo,
1111 PPCRI* shift );
1112extern PPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst,
1113 HReg dst_lo, HReg src_lo);
sewardjcdc376d2012-04-23 11:21:12 +00001114extern PPCInstr* PPCInstr_DfpI64StoD128 ( PPCFpOp op, HReg dst_hi,
1115 HReg dst_lo, HReg src);
1116extern PPCInstr* PPCInstr_DfpRound ( HReg dst, HReg src, PPCRI* r_rmc );
1117extern PPCInstr* PPCInstr_DfpRound128 ( HReg dst_hi, HReg dst_lo, HReg src_hi,
1118 HReg src_lo, PPCRI* r_rmc );
floriana7b0d102012-06-15 20:55:43 +00001119extern PPCInstr* PPCInstr_DfpQuantize ( PPCFpOp op, HReg dst, HReg srcL,
sewardjcdc376d2012-04-23 11:21:12 +00001120 HReg srcR, PPCRI* rmc );
floriana7b0d102012-06-15 20:55:43 +00001121extern PPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi,
sewardjcdc376d2012-04-23 11:21:12 +00001122 HReg dst_lo,
1123 HReg src_hi,
1124 HReg src_lo, PPCRI* rmc );
1125extern PPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op, HReg dst,
1126 HReg src_hi, HReg src_lo );
1127extern PPCInstr* PPCInstr_InsertExpD128 ( PPCFpOp op, HReg dst_hi,
1128 HReg dst_lo, HReg srcL,
1129 HReg srcR_hi, HReg srcR_lo );
1130extern PPCInstr* PPCInstr_Dfp64Cmp ( HReg dst, HReg srcL, HReg srcR );
1131extern PPCInstr* PPCInstr_Dfp128Cmp ( HReg dst, HReg srcL_hi, HReg srcL_lo,
1132 HReg srcR_hi, HReg srcR_lo );
sewardj3dee8492012-04-20 00:13:28 +00001133extern PPCInstr* PPCInstr_EvCheck ( PPCAMode* amCounter,
1134 PPCAMode* amFailAddr );
1135extern PPCInstr* PPCInstr_ProfInc ( void );
sewardjc6bbd472012-04-02 10:20:48 +00001136
floriand8c64e02014-10-08 08:54:44 +00001137extern void ppPPCInstr(const PPCInstr*, Bool mode64);
sewardjc6bbd472012-04-02 10:20:48 +00001138
cerionbcf8c3e2005-02-04 16:17:07 +00001139
1140/* Some functions that insulate the register allocator from details
1141 of the underlying instruction set. */
floriand8c64e02014-10-08 08:54:44 +00001142extern void getRegUsage_PPCInstr ( HRegUsage*, const PPCInstr*, Bool mode64 );
1143extern void mapRegs_PPCInstr ( HRegRemap*, PPCInstr* , Bool mode64);
1144extern Bool isMove_PPCInstr ( const PPCInstr*, HReg*, HReg* );
florian8462d112014-09-24 15:18:09 +00001145extern Int emit_PPCInstr ( /*MB_MOD*/Bool* is_profInc,
floriand8c64e02014-10-08 08:54:44 +00001146 UChar* buf, Int nbuf, const PPCInstr* i,
florian8462d112014-09-24 15:18:09 +00001147 Bool mode64,
1148 VexEndness endness_host,
1149 const void* disp_cp_chain_me_to_slowEP,
1150 const void* disp_cp_chain_me_to_fastEP,
1151 const void* disp_cp_xindir,
1152 const void* disp_cp_xassisted );
sewardj2a0cc852010-01-02 13:23:54 +00001153
1154extern void genSpill_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1155 HReg rreg, Int offsetB, Bool mode64 );
1156extern void genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1157 HReg rreg, Int offsetB, Bool mode64 );
1158
cerion5b2325f2005-12-23 00:55:09 +00001159extern void getAllocableRegs_PPC ( Int*, HReg**, Bool mode64 );
sewardj3dee8492012-04-20 00:13:28 +00001160extern HInstrArray* iselSB_PPC ( IRSB*,
1161 VexArch,
floriand8c64e02014-10-08 08:54:44 +00001162 const VexArchInfo*,
1163 const VexAbiInfo*,
sewardj3dee8492012-04-20 00:13:28 +00001164 Int offs_Host_EvC_Counter,
1165 Int offs_Host_EvC_FailAddr,
1166 Bool chainingAllowed,
1167 Bool addProfInc,
1168 Addr64 max_ga );
1169
1170/* How big is an event check? This is kind of a kludge because it
1171 depends on the offsets of host_EvC_FAILADDR and
1172 host_EvC_COUNTER. */
sewardj9b769162014-07-24 12:42:03 +00001173extern Int evCheckSzB_PPC ( VexEndness endness_host );
sewardj3dee8492012-04-20 00:13:28 +00001174
1175/* Perform a chaining and unchaining of an XDirect jump. */
sewardj9b769162014-07-24 12:42:03 +00001176extern VexInvalRange chainXDirect_PPC ( VexEndness endness_host,
1177 void* place_to_chain,
florian7d6f81d2014-09-22 21:43:37 +00001178 const void* disp_cp_chain_me_EXPECTED,
1179 const void* place_to_jump_to,
sewardj3dee8492012-04-20 00:13:28 +00001180 Bool mode64 );
1181
sewardj9b769162014-07-24 12:42:03 +00001182extern VexInvalRange unchainXDirect_PPC ( VexEndness endness_host,
1183 void* place_to_unchain,
florian7d6f81d2014-09-22 21:43:37 +00001184 const void* place_to_jump_to_EXPECTED,
1185 const void* disp_cp_chain_me,
sewardj3dee8492012-04-20 00:13:28 +00001186 Bool mode64 );
1187
1188/* Patch the counter location into an existing ProfInc point. */
sewardj9b769162014-07-24 12:42:03 +00001189extern VexInvalRange patchProfInc_PPC ( VexEndness endness_host,
1190 void* place_to_patch,
florian7d6f81d2014-09-22 21:43:37 +00001191 const ULong* location_of_counter,
sewardj3dee8492012-04-20 00:13:28 +00001192 Bool mode64 );
1193
cerionbcf8c3e2005-02-04 16:17:07 +00001194
sewardjcef7d3e2009-07-02 12:21:59 +00001195#endif /* ndef __VEX_HOST_PPC_DEFS_H */
cerionbcf8c3e2005-02-04 16:17:07 +00001196
1197/*---------------------------------------------------------------*/
sewardjcef7d3e2009-07-02 12:21:59 +00001198/*--- end host_ppc_defs.h ---*/
cerionbcf8c3e2005-02-04 16:17:07 +00001199/*---------------------------------------------------------------*/