blob: f4ac9bbe67c9b140900fb8cee3dd8f273f12506a [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
sewardj752f9062010-05-03 21:38:49 +000010 Copyright (C) 2004-2010 OpenWorks LLP
11 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
cerion2c49e032005-02-09 17:29:49 +000039/* Num registers used for function calls */
cerionf0de28c2005-12-13 20:21:11 +000040#define PPC_N_REGPARMS 8
cerion2c49e032005-02-09 17:29:49 +000041
cerionbcf8c3e2005-02-04 16:17:07 +000042
43/* --------- Registers. --------- */
44
45/* The usual HReg abstraction. There are 32 real int regs,
cerion225a0342005-09-12 20:49:09 +000046 32 real float regs, and 32 real vector regs.
cerionbcf8c3e2005-02-04 16:17:07 +000047*/
48
cerion5b2325f2005-12-23 00:55:09 +000049extern void ppHRegPPC ( HReg );
cerionbcf8c3e2005-02-04 16:17:07 +000050
cerionf0de28c2005-12-13 20:21:11 +000051extern HReg hregPPC_GPR0 ( Bool mode64 ); // scratch reg / zero reg
52extern HReg hregPPC_GPR1 ( Bool mode64 ); // Stack Frame Pointer
53extern HReg hregPPC_GPR2 ( Bool mode64 ); // not used: TOC pointer
54extern HReg hregPPC_GPR3 ( Bool mode64 );
55extern HReg hregPPC_GPR4 ( Bool mode64 );
56extern HReg hregPPC_GPR5 ( Bool mode64 );
57extern HReg hregPPC_GPR6 ( Bool mode64 );
58extern HReg hregPPC_GPR7 ( Bool mode64 );
59extern HReg hregPPC_GPR8 ( Bool mode64 );
60extern HReg hregPPC_GPR9 ( Bool mode64 );
61extern HReg hregPPC_GPR10 ( Bool mode64 );
cerion5b2325f2005-12-23 00:55:09 +000062extern HReg hregPPC_GPR11 ( Bool mode64 );
63extern HReg hregPPC_GPR12 ( Bool mode64 );
64extern HReg hregPPC_GPR13 ( Bool mode64 );
cerionf0de28c2005-12-13 20:21:11 +000065extern HReg hregPPC_GPR14 ( Bool mode64 );
66extern HReg hregPPC_GPR15 ( Bool mode64 );
67extern HReg hregPPC_GPR16 ( Bool mode64 );
68extern HReg hregPPC_GPR17 ( Bool mode64 );
69extern HReg hregPPC_GPR18 ( Bool mode64 );
70extern HReg hregPPC_GPR19 ( Bool mode64 );
71extern HReg hregPPC_GPR20 ( Bool mode64 );
72extern HReg hregPPC_GPR21 ( Bool mode64 );
73extern HReg hregPPC_GPR22 ( Bool mode64 );
74extern HReg hregPPC_GPR23 ( Bool mode64 );
75extern HReg hregPPC_GPR24 ( Bool mode64 );
76extern HReg hregPPC_GPR25 ( Bool mode64 );
77extern HReg hregPPC_GPR26 ( Bool mode64 );
78extern HReg hregPPC_GPR27 ( Bool mode64 );
79extern HReg hregPPC_GPR28 ( Bool mode64 );
sewardjb8a8dba2005-12-15 21:33:50 +000080extern HReg hregPPC_GPR29 ( Bool mode64 ); // reserved for dispatcher
cerion5b2325f2005-12-23 00:55:09 +000081extern HReg hregPPC_GPR30 ( Bool mode64 ); // used as VMX spill temp
sewardjb8a8dba2005-12-15 21:33:50 +000082extern HReg hregPPC_GPR31 ( Bool mode64 ); // GuestStatePtr (callee-saved)
cerionbcf8c3e2005-02-04 16:17:07 +000083
cerion5b2325f2005-12-23 00:55:09 +000084extern HReg hregPPC_FPR0 ( void );
85extern HReg hregPPC_FPR1 ( void );
86extern HReg hregPPC_FPR2 ( void );
87extern HReg hregPPC_FPR3 ( void );
88extern HReg hregPPC_FPR4 ( void );
89extern HReg hregPPC_FPR5 ( void );
90extern HReg hregPPC_FPR6 ( void );
91extern HReg hregPPC_FPR7 ( void );
92extern HReg hregPPC_FPR8 ( void );
93extern HReg hregPPC_FPR9 ( void );
94extern HReg hregPPC_FPR10 ( void );
95extern HReg hregPPC_FPR11 ( void );
96extern HReg hregPPC_FPR12 ( void );
97extern HReg hregPPC_FPR13 ( void );
98extern HReg hregPPC_FPR14 ( void );
99extern HReg hregPPC_FPR15 ( void );
100extern HReg hregPPC_FPR16 ( void );
101extern HReg hregPPC_FPR17 ( void );
102extern HReg hregPPC_FPR18 ( void );
103extern HReg hregPPC_FPR19 ( void );
104extern HReg hregPPC_FPR20 ( void );
105extern HReg hregPPC_FPR21 ( void );
106extern HReg hregPPC_FPR22 ( void );
107extern HReg hregPPC_FPR23 ( void );
108extern HReg hregPPC_FPR24 ( void );
109extern HReg hregPPC_FPR25 ( void );
110extern HReg hregPPC_FPR26 ( void );
111extern HReg hregPPC_FPR27 ( void );
112extern HReg hregPPC_FPR28 ( void );
113extern HReg hregPPC_FPR29 ( void );
114extern HReg hregPPC_FPR30 ( void );
115extern HReg hregPPC_FPR31 ( void );
cerionbcf8c3e2005-02-04 16:17:07 +0000116
cerion5b2325f2005-12-23 00:55:09 +0000117extern HReg hregPPC_VR0 ( void );
118extern HReg hregPPC_VR1 ( void );
119extern HReg hregPPC_VR2 ( void );
120extern HReg hregPPC_VR3 ( void );
121extern HReg hregPPC_VR4 ( void );
122extern HReg hregPPC_VR5 ( void );
123extern HReg hregPPC_VR6 ( void );
124extern HReg hregPPC_VR7 ( void );
125extern HReg hregPPC_VR8 ( void );
126extern HReg hregPPC_VR9 ( void );
127extern HReg hregPPC_VR10 ( void );
128extern HReg hregPPC_VR11 ( void );
129extern HReg hregPPC_VR12 ( void );
130extern HReg hregPPC_VR13 ( void );
131extern HReg hregPPC_VR14 ( void );
132extern HReg hregPPC_VR15 ( void );
133extern HReg hregPPC_VR16 ( void );
134extern HReg hregPPC_VR17 ( void );
135extern HReg hregPPC_VR18 ( void );
136extern HReg hregPPC_VR19 ( void );
137extern HReg hregPPC_VR20 ( void );
138extern HReg hregPPC_VR21 ( void );
139extern HReg hregPPC_VR22 ( void );
140extern HReg hregPPC_VR23 ( void );
141extern HReg hregPPC_VR24 ( void );
142extern HReg hregPPC_VR25 ( void );
143extern HReg hregPPC_VR26 ( void );
144extern HReg hregPPC_VR27 ( void );
145extern HReg hregPPC_VR28 ( void );
146extern HReg hregPPC_VR29 ( void );
147extern HReg hregPPC_VR30 ( void );
148extern HReg hregPPC_VR31 ( void );
cerionbcf8c3e2005-02-04 16:17:07 +0000149
cerionf0de28c2005-12-13 20:21:11 +0000150#define StackFramePtr(_mode64) hregPPC_GPR1(_mode64)
151#define GuestStatePtr(_mode64) hregPPC_GPR31(_mode64)
cerionbcf8c3e2005-02-04 16:17:07 +0000152
cerion2c49e032005-02-09 17:29:49 +0000153
154
sewardjb51f0f42005-07-18 11:38:02 +0000155/* --------- Condition codes --------- */
cerion2c49e032005-02-09 17:29:49 +0000156
sewardjb51f0f42005-07-18 11:38:02 +0000157/* This gives names from bitfields in CR; hence it names BI numbers */
158/* Using IBM/hardware indexing convention */
cerion2c49e032005-02-09 17:29:49 +0000159typedef
sewardjb51f0f42005-07-18 11:38:02 +0000160 enum {
161 // CR7, which we use for integer compares
162 Pcf_7LT = 28, /* neg | lt */
163 Pcf_7GT = 29, /* pos | gt */
164 Pcf_7EQ = 30, /* zero | equal */
sewardj7e308072011-05-04 09:50:48 +0000165 Pcf_7SO = 31, /* summary overflow */
166 Pcf_NONE = 32 /* no condition; used with Pct_ALWAYS */
cerionab9132d2005-02-15 15:46:59 +0000167 }
cerion5b2325f2005-12-23 00:55:09 +0000168 PPCCondFlag;
cerion2c49e032005-02-09 17:29:49 +0000169
cerionab9132d2005-02-15 15:46:59 +0000170typedef
cerion7cf8e4e2005-02-16 16:08:17 +0000171 enum { /* Maps bc bitfield BO */
sewardj7e308072011-05-04 09:50:48 +0000172 Pct_FALSE = 0x4, /* associated PPCCondFlag must not be Pcf_NONE */
173 Pct_TRUE = 0xC, /* associated PPCCondFlag must not be Pcf_NONE */
174 Pct_ALWAYS = 0x14 /* associated PPCCondFlag must be Pcf_NONE */
cerionab9132d2005-02-15 15:46:59 +0000175 }
cerion5b2325f2005-12-23 00:55:09 +0000176 PPCCondTest;
cerionab9132d2005-02-15 15:46:59 +0000177
178typedef
179 struct {
cerion5b2325f2005-12-23 00:55:09 +0000180 PPCCondFlag flag;
181 PPCCondTest test;
cerion2c49e032005-02-09 17:29:49 +0000182 }
cerion5b2325f2005-12-23 00:55:09 +0000183 PPCCondCode;
cerion2c49e032005-02-09 17:29:49 +0000184
cerion5b2325f2005-12-23 00:55:09 +0000185extern HChar* showPPCCondCode ( PPCCondCode );
cerionbcf8c3e2005-02-04 16:17:07 +0000186
cerion7cf8e4e2005-02-16 16:08:17 +0000187/* constructor */
cerion5b2325f2005-12-23 00:55:09 +0000188extern PPCCondCode mk_PPCCondCode ( PPCCondTest, PPCCondFlag );
cerion7cf8e4e2005-02-16 16:08:17 +0000189
190/* false->true, true->false */
cerion5b2325f2005-12-23 00:55:09 +0000191extern PPCCondTest invertCondTest ( PPCCondTest );
cerionbcf8c3e2005-02-04 16:17:07 +0000192
cerionab9132d2005-02-15 15:46:59 +0000193
194
cerion33aa6da2005-02-16 10:25:26 +0000195
cerionbcf8c3e2005-02-04 16:17:07 +0000196/* --------- Memory address expressions (amodes). --------- */
197
198typedef
199 enum {
sewardj92923de2006-01-25 21:29:48 +0000200 Pam_IR=1, /* Immediate (signed 16-bit) + Reg */
201 Pam_RR=2 /* Reg1 + Reg2 */
cerionbcf8c3e2005-02-04 16:17:07 +0000202 }
cerion5b2325f2005-12-23 00:55:09 +0000203 PPCAModeTag;
cerionbcf8c3e2005-02-04 16:17:07 +0000204
205typedef
206 struct {
cerion5b2325f2005-12-23 00:55:09 +0000207 PPCAModeTag tag;
cerionbcf8c3e2005-02-04 16:17:07 +0000208 union {
209 struct {
210 HReg base;
sewardja5f957d2005-07-02 01:29:32 +0000211 Int index;
cerionbcf8c3e2005-02-04 16:17:07 +0000212 } IR;
213 struct {
214 HReg base;
215 HReg index;
216 } RR;
217 } Pam;
218 }
cerion5b2325f2005-12-23 00:55:09 +0000219 PPCAMode;
cerionbcf8c3e2005-02-04 16:17:07 +0000220
cerion5b2325f2005-12-23 00:55:09 +0000221extern PPCAMode* PPCAMode_IR ( Int, HReg );
222extern PPCAMode* PPCAMode_RR ( HReg, HReg );
cerionbcf8c3e2005-02-04 16:17:07 +0000223
cerion5b2325f2005-12-23 00:55:09 +0000224extern PPCAMode* dopyPPCAMode ( PPCAMode* );
cerionbcf8c3e2005-02-04 16:17:07 +0000225
cerion5b2325f2005-12-23 00:55:09 +0000226extern void ppPPCAMode ( PPCAMode* );
cerionbcf8c3e2005-02-04 16:17:07 +0000227
228
sewardjb51f0f42005-07-18 11:38:02 +0000229/* --------- Operand, which can be a reg or a u16/s16. --------- */
230/* ("RH" == "Register or Halfword immediate") */
cerionbcf8c3e2005-02-04 16:17:07 +0000231typedef
232 enum {
sewardj92923de2006-01-25 21:29:48 +0000233 Prh_Imm=3,
234 Prh_Reg=4
cerionbcf8c3e2005-02-04 16:17:07 +0000235 }
cerion5b2325f2005-12-23 00:55:09 +0000236 PPCRHTag;
sewardjb51f0f42005-07-18 11:38:02 +0000237
238typedef
239 struct {
cerion5b2325f2005-12-23 00:55:09 +0000240 PPCRHTag tag;
sewardjb51f0f42005-07-18 11:38:02 +0000241 union {
242 struct {
243 Bool syned;
244 UShort imm16;
245 } Imm;
246 struct {
247 HReg reg;
248 } Reg;
249 }
250 Prh;
251 }
cerion5b2325f2005-12-23 00:55:09 +0000252 PPCRH;
sewardjb51f0f42005-07-18 11:38:02 +0000253
cerion5b2325f2005-12-23 00:55:09 +0000254extern PPCRH* PPCRH_Imm ( Bool, UShort );
255extern PPCRH* PPCRH_Reg ( HReg );
sewardjb51f0f42005-07-18 11:38:02 +0000256
cerion5b2325f2005-12-23 00:55:09 +0000257extern void ppPPCRH ( PPCRH* );
sewardjb51f0f42005-07-18 11:38:02 +0000258
259
cerionf0de28c2005-12-13 20:21:11 +0000260/* --------- Operand, which can be a reg or a u32/64. --------- */
sewardjb51f0f42005-07-18 11:38:02 +0000261
262typedef
263 enum {
sewardj92923de2006-01-25 21:29:48 +0000264 Pri_Imm=5,
265 Pri_Reg=6
sewardjb51f0f42005-07-18 11:38:02 +0000266 }
cerion5b2325f2005-12-23 00:55:09 +0000267 PPCRITag;
cerionbcf8c3e2005-02-04 16:17:07 +0000268
269typedef
270 struct {
cerion5b2325f2005-12-23 00:55:09 +0000271 PPCRITag tag;
cerionbcf8c3e2005-02-04 16:17:07 +0000272 union {
cerionf0de28c2005-12-13 20:21:11 +0000273 ULong Imm;
274 HReg Reg;
cerionbcf8c3e2005-02-04 16:17:07 +0000275 }
276 Pri;
277 }
cerion5b2325f2005-12-23 00:55:09 +0000278 PPCRI;
cerionbcf8c3e2005-02-04 16:17:07 +0000279
cerion5b2325f2005-12-23 00:55:09 +0000280extern PPCRI* PPCRI_Imm ( ULong );
sewardj478646f2008-05-01 20:13:04 +0000281extern PPCRI* PPCRI_Reg( HReg );
cerionbcf8c3e2005-02-04 16:17:07 +0000282
cerion5b2325f2005-12-23 00:55:09 +0000283extern void ppPPCRI ( PPCRI* );
cerionbcf8c3e2005-02-04 16:17:07 +0000284
285
cerion27b3d7e2005-09-14 20:35:47 +0000286/* --------- Operand, which can be a vector reg or a s6. --------- */
287/* ("VI" == "Vector Register or Immediate") */
288typedef
289 enum {
sewardj92923de2006-01-25 21:29:48 +0000290 Pvi_Imm=7,
291 Pvi_Reg=8
cerion27b3d7e2005-09-14 20:35:47 +0000292 }
cerion5b2325f2005-12-23 00:55:09 +0000293 PPCVI5sTag;
cerion27b3d7e2005-09-14 20:35:47 +0000294
295typedef
296 struct {
cerion5b2325f2005-12-23 00:55:09 +0000297 PPCVI5sTag tag;
cerion27b3d7e2005-09-14 20:35:47 +0000298 union {
299 Char Imm5s;
300 HReg Reg;
301 }
302 Pvi;
303 }
cerion5b2325f2005-12-23 00:55:09 +0000304 PPCVI5s;
cerion27b3d7e2005-09-14 20:35:47 +0000305
cerion5b2325f2005-12-23 00:55:09 +0000306extern PPCVI5s* PPCVI5s_Imm ( Char );
307extern PPCVI5s* PPCVI5s_Reg ( HReg );
cerion27b3d7e2005-09-14 20:35:47 +0000308
cerion5b2325f2005-12-23 00:55:09 +0000309extern void ppPPCVI5s ( PPCVI5s* );
cerion27b3d7e2005-09-14 20:35:47 +0000310
311
cerioncd304492005-02-08 19:40:24 +0000312/* --------- Instructions. --------- */
cerionbcf8c3e2005-02-04 16:17:07 +0000313
cerion2c49e032005-02-09 17:29:49 +0000314/* --------- */
315typedef
316 enum {
317 Pun_NEG,
cerione13bb312005-02-10 19:51:03 +0000318 Pun_NOT,
cerion07b07a92005-12-22 14:32:35 +0000319 Pun_CLZ32,
sewardj7fd5bb02006-01-26 02:24:17 +0000320 Pun_CLZ64,
321 Pun_EXTSW
cerion2c49e032005-02-09 17:29:49 +0000322 }
cerion5b2325f2005-12-23 00:55:09 +0000323 PPCUnaryOp;
cerion2c49e032005-02-09 17:29:49 +0000324
cerion5b2325f2005-12-23 00:55:09 +0000325extern HChar* showPPCUnaryOp ( PPCUnaryOp );
cerioncd304492005-02-08 19:40:24 +0000326
327
328/* --------- */
329typedef
330 enum {
331 Palu_INVALID,
sewardjb51f0f42005-07-18 11:38:02 +0000332 Palu_ADD, Palu_SUB,
333 Palu_AND, Palu_OR, Palu_XOR,
cerioncd304492005-02-08 19:40:24 +0000334 }
cerion5b2325f2005-12-23 00:55:09 +0000335 PPCAluOp;
cerioncd304492005-02-08 19:40:24 +0000336
sewardjb51f0f42005-07-18 11:38:02 +0000337extern
cerion5b2325f2005-12-23 00:55:09 +0000338HChar* showPPCAluOp ( PPCAluOp,
339 Bool /* is the 2nd operand an immediate? */);
cerionbb01b7c2005-12-16 13:40:18 +0000340
341
342/* --------- */
343typedef
344 enum {
345 Pshft_INVALID,
346 Pshft_SHL, Pshft_SHR, Pshft_SAR,
347 }
cerion5b2325f2005-12-23 00:55:09 +0000348 PPCShftOp;
cerionbb01b7c2005-12-16 13:40:18 +0000349
350extern
cerion5b2325f2005-12-23 00:55:09 +0000351HChar* showPPCShftOp ( PPCShftOp,
352 Bool /* is the 2nd operand an immediate? */,
353 Bool /* is this a 32bit or 64bit op? */ );
cerionab9132d2005-02-15 15:46:59 +0000354
355
cerion094d1392005-06-20 13:45:57 +0000356/* --------- */
357typedef
358 enum {
359 Pfp_INVALID,
sewardj40c80262006-02-08 19:30:46 +0000360
361 /* Ternary */
362 Pfp_MADDD, Pfp_MSUBD,
363 Pfp_MADDS, Pfp_MSUBS,
364
cerion094d1392005-06-20 13:45:57 +0000365 /* Binary */
sewardjb183b852006-02-03 16:08:03 +0000366 Pfp_ADDD, Pfp_SUBD, Pfp_MULD, Pfp_DIVD,
367 Pfp_ADDS, Pfp_SUBS, Pfp_MULS, Pfp_DIVS,
cerion094d1392005-06-20 13:45:57 +0000368
369 /* Unary */
sewardj0f1ef862008-08-08 08:37:06 +0000370 Pfp_SQRT, Pfp_ABS, Pfp_NEG, Pfp_MOV, Pfp_RES, Pfp_RSQRTE,
371 Pfp_FRIN, Pfp_FRIM, Pfp_FRIP, Pfp_FRIZ
cerion094d1392005-06-20 13:45:57 +0000372 }
cerion5b2325f2005-12-23 00:55:09 +0000373 PPCFpOp;
cerion094d1392005-06-20 13:45:57 +0000374
cerion5b2325f2005-12-23 00:55:09 +0000375extern HChar* showPPCFpOp ( PPCFpOp );
cerionbcf8c3e2005-02-04 16:17:07 +0000376
377
378/* --------- */
379typedef
380 enum {
cerionc3d8bdc2005-06-28 18:06:23 +0000381 Pav_INVALID,
382
383 /* Integer Unary */
384 Pav_MOV, /* Mov */
385 Pav_NOT, /* Bitwise */
386 Pav_UNPCKH8S, Pav_UNPCKH16S, /* Unpack */
387 Pav_UNPCKL8S, Pav_UNPCKL16S,
388 Pav_UNPCKHPIX, Pav_UNPCKLPIX,
389
390 /* Integer Binary */
cerion8ea0d3e2005-11-14 00:44:47 +0000391 Pav_AND, Pav_OR, Pav_XOR, /* Bitwise */
cerionf34ccc42005-09-16 08:55:50 +0000392 Pav_ADDU, Pav_QADDU, Pav_QADDS,
cerionf34ccc42005-09-16 08:55:50 +0000393 Pav_SUBU, Pav_QSUBU, Pav_QSUBS,
cerion6b6f59e2005-06-28 20:59:18 +0000394 Pav_OMULU, Pav_OMULS, Pav_EMULU, Pav_EMULS,
cerion6b6f59e2005-06-28 20:59:18 +0000395 Pav_AVGU, Pav_AVGS,
396 Pav_MAXU, Pav_MAXS,
397 Pav_MINU, Pav_MINS,
cerionc3d8bdc2005-06-28 18:06:23 +0000398
399 /* Compare (always affects CR field 6) */
cerion6b6f59e2005-06-28 20:59:18 +0000400 Pav_CMPEQU, Pav_CMPGTU, Pav_CMPGTS,
cerionc3d8bdc2005-06-28 18:06:23 +0000401
402 /* Shift */
cerion6b6f59e2005-06-28 20:59:18 +0000403 Pav_SHL, Pav_SHR, Pav_SAR, Pav_ROTL,
cerionc3d8bdc2005-06-28 18:06:23 +0000404
405 /* Pack */
cerionf34ccc42005-09-16 08:55:50 +0000406 Pav_PACKUU, Pav_QPACKUU, Pav_QPACKSU, Pav_QPACKSS,
cerion6b6f59e2005-06-28 20:59:18 +0000407 Pav_PACKPXL,
cerionc3d8bdc2005-06-28 18:06:23 +0000408
409 /* Merge */
cerion6b6f59e2005-06-28 20:59:18 +0000410 Pav_MRGHI, Pav_MRGLO,
cerionc3d8bdc2005-06-28 18:06:23 +0000411 }
cerion5b2325f2005-12-23 00:55:09 +0000412 PPCAvOp;
cerionc3d8bdc2005-06-28 18:06:23 +0000413
cerion5b2325f2005-12-23 00:55:09 +0000414extern HChar* showPPCAvOp ( PPCAvOp );
cerionc3d8bdc2005-06-28 18:06:23 +0000415
416
417/* --------- */
418typedef
419 enum {
cerion8ea0d3e2005-11-14 00:44:47 +0000420 Pavfp_INVALID,
421
422 /* Floating point binary */
423 Pavfp_ADDF, Pavfp_SUBF, Pavfp_MULF,
424 Pavfp_MAXF, Pavfp_MINF,
425 Pavfp_CMPEQF, Pavfp_CMPGTF, Pavfp_CMPGEF,
426
427 /* Floating point unary */
428 Pavfp_RCPF, Pavfp_RSQRTF,
ceriond963eb42005-11-16 18:02:58 +0000429 Pavfp_CVTU2F, Pavfp_CVTS2F, Pavfp_QCVTF2U, Pavfp_QCVTF2S,
430 Pavfp_ROUNDM, Pavfp_ROUNDP, Pavfp_ROUNDN, Pavfp_ROUNDZ,
cerion8ea0d3e2005-11-14 00:44:47 +0000431 }
cerion5b2325f2005-12-23 00:55:09 +0000432 PPCAvFpOp;
cerion8ea0d3e2005-11-14 00:44:47 +0000433
cerion5b2325f2005-12-23 00:55:09 +0000434extern HChar* showPPCAvFpOp ( PPCAvFpOp );
cerion8ea0d3e2005-11-14 00:44:47 +0000435
436
437/* --------- */
438typedef
439 enum {
cerionf0de28c2005-12-13 20:21:11 +0000440 Pin_LI, /* load word (32/64-bit) immediate (fake insn) */
cerionbb01b7c2005-12-16 13:40:18 +0000441 Pin_Alu, /* word add/sub/and/or/xor */
442 Pin_Shft, /* word shl/shr/sar */
cerion5b2325f2005-12-23 00:55:09 +0000443 Pin_AddSubC, /* add/sub with read/write carry */
cerionf0de28c2005-12-13 20:21:11 +0000444 Pin_Cmp, /* word compare */
445 Pin_Unary, /* not, neg, clz */
cerioned623db2005-06-20 12:42:04 +0000446 Pin_MulL, /* widening multiply */
447 Pin_Div, /* div */
448 Pin_Call, /* call to address in register */
449 Pin_Goto, /* conditional/unconditional jmp to dst */
cerionf0de28c2005-12-13 20:21:11 +0000450 Pin_CMov, /* conditional move */
sewardj7fd5bb02006-01-26 02:24:17 +0000451 Pin_Load, /* zero-extending load a 8|16|32|64 bit value from mem */
sewardje9d8a262009-07-01 08:06:34 +0000452 Pin_LoadL, /* load-linked (lwarx/ldarx) 32|64 bit value from mem */
cerion5b2325f2005-12-23 00:55:09 +0000453 Pin_Store, /* store a 8|16|32|64 bit value to mem */
sewardje9d8a262009-07-01 08:06:34 +0000454 Pin_StoreC, /* store-conditional (stwcx./stdcx.) 32|64 bit val */
cerion5b2325f2005-12-23 00:55:09 +0000455 Pin_Set, /* convert condition code to value 0 or 1 */
sewardjb51f0f42005-07-18 11:38:02 +0000456 Pin_MfCR, /* move from condition register to GPR */
457 Pin_MFence, /* mem fence */
cerionc3d8bdc2005-06-28 18:06:23 +0000458
cerion094d1392005-06-20 13:45:57 +0000459 Pin_FpUnary, /* FP unary op */
460 Pin_FpBinary, /* FP binary op */
sewardj40c80262006-02-08 19:30:46 +0000461 Pin_FpMulAcc, /* FP multipy-accumulate style op */
cerion094d1392005-06-20 13:45:57 +0000462 Pin_FpLdSt, /* FP load/store */
sewardj92923de2006-01-25 21:29:48 +0000463 Pin_FpSTFIW, /* stfiwx */
464 Pin_FpRSP, /* FP round IEEE754 double to IEEE754 single */
sewardj7d810d72011-05-08 22:05:10 +0000465 Pin_FpCftI, /* fcfid[u,s,us]/fctid[u]/fctiw[u] */
cerion094d1392005-06-20 13:45:57 +0000466 Pin_FpCMov, /* FP floating point conditional move */
467 Pin_FpLdFPSCR, /* mtfsf */
468 Pin_FpCmp, /* FP compare, generating value into int reg */
sewardj92923de2006-01-25 21:29:48 +0000469
cerionc3d8bdc2005-06-28 18:06:23 +0000470 Pin_RdWrLR, /* Read/Write Link Register */
471
cerionc3d8bdc2005-06-28 18:06:23 +0000472 Pin_AvLdSt, /* AV load/store (kludging for AMode_IR) */
473 Pin_AvUnary, /* AV unary general reg=>reg */
cerion6b6f59e2005-06-28 20:59:18 +0000474
cerionc3d8bdc2005-06-28 18:06:23 +0000475 Pin_AvBinary, /* AV binary general reg,reg=>reg */
cerion6b6f59e2005-06-28 20:59:18 +0000476 Pin_AvBin8x16, /* AV binary, 8x4 */
477 Pin_AvBin16x8, /* AV binary, 16x4 */
478 Pin_AvBin32x4, /* AV binary, 32x4 */
479
480 Pin_AvBin32Fx4, /* AV FP binary, 32Fx4 */
cerion8ea0d3e2005-11-14 00:44:47 +0000481 Pin_AvUn32Fx4, /* AV FP unary, 32Fx4 */
cerionc3d8bdc2005-06-28 18:06:23 +0000482
483 Pin_AvPerm, /* AV permute (shuffle) */
484 Pin_AvSel, /* AV select */
485 Pin_AvShlDbl, /* AV shift-left double by imm */
486 Pin_AvSplat, /* One elem repeated throughout dst */
cerion6b6f59e2005-06-28 20:59:18 +0000487 Pin_AvLdVSCR, /* mtvscr */
488 Pin_AvCMov /* AV conditional move */
cerionbcf8c3e2005-02-04 16:17:07 +0000489 }
cerion5b2325f2005-12-23 00:55:09 +0000490 PPCInstrTag;
cerionbcf8c3e2005-02-04 16:17:07 +0000491
cerioncd304492005-02-08 19:40:24 +0000492/* Destinations are on the LEFT (first operand) */
cerionbcf8c3e2005-02-04 16:17:07 +0000493
494typedef
495 struct {
cerion5b2325f2005-12-23 00:55:09 +0000496 PPCInstrTag tag;
cerioncd304492005-02-08 19:40:24 +0000497 union {
cerion5b2325f2005-12-23 00:55:09 +0000498 /* Get a 32/64-bit literal into a register.
499 May turn into a number of real insns. */
sewardjb51f0f42005-07-18 11:38:02 +0000500 struct {
501 HReg dst;
cerionf0de28c2005-12-13 20:21:11 +0000502 ULong imm64;
503 } LI;
cerionbb01b7c2005-12-16 13:40:18 +0000504 /* Integer add/sub/and/or/xor. Limitations:
sewardjb51f0f42005-07-18 11:38:02 +0000505 - For add, the immediate, if it exists, is a signed 16.
506 - For sub, the immediate, if it exists, is a signed 16
507 which may not be -32768, since no such instruction
508 exists, and so we have to emit addi with +32768, but
509 that is not possible.
510 - For and/or/xor, the immediate, if it exists,
511 is an unsigned 16.
sewardjb51f0f42005-07-18 11:38:02 +0000512 */
cerioncd304492005-02-08 19:40:24 +0000513 struct {
cerion5b2325f2005-12-23 00:55:09 +0000514 PPCAluOp op;
515 HReg dst;
516 HReg srcL;
517 PPCRH* srcR;
cerionf0de28c2005-12-13 20:21:11 +0000518 } Alu;
cerionbb01b7c2005-12-16 13:40:18 +0000519 /* Integer shl/shr/sar.
520 Limitations: the immediate, if it exists,
521 is a signed 5-bit value between 1 and 31 inclusive.
522 */
523 struct {
cerion5b2325f2005-12-23 00:55:09 +0000524 PPCShftOp op;
525 Bool sz32; /* mode64 has both 32 and 64bit shft */
526 HReg dst;
527 HReg srcL;
528 PPCRH* srcR;
cerionbb01b7c2005-12-16 13:40:18 +0000529 } Shft;
cerion4a49b032005-11-08 16:23:07 +0000530 /* */
531 struct {
532 Bool isAdd; /* else sub */
533 Bool setC; /* else read carry */
534 HReg dst;
535 HReg srcL;
536 HReg srcR;
cerion5b2325f2005-12-23 00:55:09 +0000537 } AddSubC;
sewardjb51f0f42005-07-18 11:38:02 +0000538 /* If signed, the immediate, if it exists, is a signed 16,
539 else it is an unsigned 16. */
cerioncd304492005-02-08 19:40:24 +0000540 struct {
cerion5b2325f2005-12-23 00:55:09 +0000541 Bool syned;
542 Bool sz32; /* mode64 has both 32 and 64bit cmp */
543 UInt crfD;
544 HReg srcL;
545 PPCRH* srcR;
cerionf0de28c2005-12-13 20:21:11 +0000546 } Cmp;
sewardj7fd5bb02006-01-26 02:24:17 +0000547 /* Not, Neg, Clz32/64, Extsw */
cerion2c49e032005-02-09 17:29:49 +0000548 struct {
cerion5b2325f2005-12-23 00:55:09 +0000549 PPCUnaryOp op;
550 HReg dst;
551 HReg src;
552 } Unary;
cerion92f5dc72005-02-10 16:11:35 +0000553 struct {
sewardjb51f0f42005-07-18 11:38:02 +0000554 Bool syned; /* meaningless if hi32==False */
cerionf0de28c2005-12-13 20:21:11 +0000555 Bool hi; /* False=>low, True=>high */
cerionbb01b7c2005-12-16 13:40:18 +0000556 Bool sz32; /* mode64 has both 32 & 64bit mull */
sewardjb51f0f42005-07-18 11:38:02 +0000557 HReg dst;
558 HReg srcL;
559 HReg srcR;
cerion92f5dc72005-02-10 16:11:35 +0000560 } MulL;
cerion9e263e32005-03-03 17:21:51 +0000561 /* ppc32 div/divu instruction. */
cerionc0e707e2005-02-10 22:35:34 +0000562 struct {
cerion33aa6da2005-02-16 10:25:26 +0000563 Bool syned;
cerionbb01b7c2005-12-16 13:40:18 +0000564 Bool sz32; /* mode64 has both 32 & 64bit div */
cerion33aa6da2005-02-16 10:25:26 +0000565 HReg dst;
ceriona2f75882005-03-15 16:33:38 +0000566 HReg srcL;
567 HReg srcR;
cerionc0e707e2005-02-10 22:35:34 +0000568 } Div;
cerion2c49e032005-02-09 17:29:49 +0000569 /* Pseudo-insn. Call target (an absolute address), on given
sewardj6a64a9f2005-08-21 00:48:37 +0000570 condition (which could be Pct_ALWAYS). argiregs indicates
571 which of r3 .. r10 carries argument values for this call,
572 using a bit mask (1<<N is set if rN holds an arg, for N in
573 3 .. 10 inclusive). */
cerion2c49e032005-02-09 17:29:49 +0000574 struct {
cerion5b2325f2005-12-23 00:55:09 +0000575 PPCCondCode cond;
576 Addr64 target;
577 UInt argiregs;
cerion2c49e032005-02-09 17:29:49 +0000578 } Call;
579 /* Pseudo-insn. Goto dst, on given condition (which could be
sewardjb51f0f42005-07-18 11:38:02 +0000580 Pct_ALWAYS). */
cerion2c49e032005-02-09 17:29:49 +0000581 struct {
cerion5b2325f2005-12-23 00:55:09 +0000582 IRJumpKind jk;
583 PPCCondCode cond;
584 PPCRI* dst;
cerion2c49e032005-02-09 17:29:49 +0000585 } Goto;
cerionb536af92005-02-10 15:03:19 +0000586 /* Mov src to dst on the given condition, which may not
cerion9abfcbc2005-02-25 11:16:58 +0000587 be the bogus Pct_ALWAYS. */
cerionb536af92005-02-10 15:03:19 +0000588 struct {
cerion5b2325f2005-12-23 00:55:09 +0000589 PPCCondCode cond;
cerioncd304492005-02-08 19:40:24 +0000590 HReg dst;
cerion5b2325f2005-12-23 00:55:09 +0000591 PPCRI* src;
592 } CMov;
sewardj7fd5bb02006-01-26 02:24:17 +0000593 /* Zero extending loads. Dst size is host word size */
cerion5b2325f2005-12-23 00:55:09 +0000594 struct {
595 UChar sz; /* 1|2|4|8 */
cerion5b2325f2005-12-23 00:55:09 +0000596 HReg dst;
597 PPCAMode* src;
cerion7cf8e4e2005-02-16 16:08:17 +0000598 } Load;
sewardje9d8a262009-07-01 08:06:34 +0000599 /* Load-and-reserve (lwarx, ldarx) */
600 struct {
601 UChar sz; /* 4|8 */
602 HReg dst;
603 HReg src;
604 } LoadL;
cerion5b2325f2005-12-23 00:55:09 +0000605 /* 64/32/16/8 bit stores */
cerioncd304492005-02-08 19:40:24 +0000606 struct {
cerion5b2325f2005-12-23 00:55:09 +0000607 UChar sz; /* 1|2|4|8 */
608 PPCAMode* dst;
609 HReg src;
cerioncd304492005-02-08 19:40:24 +0000610 } Store;
sewardje9d8a262009-07-01 08:06:34 +0000611 /* Store-conditional (stwcx., stdcx.) */
612 struct {
613 UChar sz; /* 4|8 */
614 HReg dst;
615 HReg src;
616 } StoreC;
cerion5b2325f2005-12-23 00:55:09 +0000617 /* Convert a ppc condition code to value 0 or 1. */
cerionb536af92005-02-10 15:03:19 +0000618 struct {
cerion5b2325f2005-12-23 00:55:09 +0000619 PPCCondCode cond;
620 HReg dst;
621 } Set;
sewardjb51f0f42005-07-18 11:38:02 +0000622 /* Move the entire CR to a GPR */
623 struct {
624 HReg dst;
625 } MfCR;
cerion98411db2005-02-16 14:14:49 +0000626 /* Mem fence. In short, an insn which flushes all preceding
627 loads and stores as much as possible before continuing.
cerion5b2325f2005-12-23 00:55:09 +0000628 On PPC we emit a "sync". */
cerion92f5dc72005-02-10 16:11:35 +0000629 struct {
cerion92f5dc72005-02-10 16:11:35 +0000630 } MFence;
cerioncd304492005-02-08 19:40:24 +0000631
cerion5b2325f2005-12-23 00:55:09 +0000632 /* PPC Floating point */
cerion094d1392005-06-20 13:45:57 +0000633 struct {
cerion5b2325f2005-12-23 00:55:09 +0000634 PPCFpOp op;
635 HReg dst;
636 HReg src;
cerion094d1392005-06-20 13:45:57 +0000637 } FpUnary;
638 struct {
cerion5b2325f2005-12-23 00:55:09 +0000639 PPCFpOp op;
640 HReg dst;
641 HReg srcL;
642 HReg srcR;
cerion094d1392005-06-20 13:45:57 +0000643 } FpBinary;
644 struct {
sewardj40c80262006-02-08 19:30:46 +0000645 PPCFpOp op;
646 HReg dst;
647 HReg srcML;
648 HReg srcMR;
649 HReg srcAcc;
650 } FpMulAcc;
651 struct {
cerion5b2325f2005-12-23 00:55:09 +0000652 Bool isLoad;
653 UChar sz; /* only 4 (IEEE single) or 8 (IEEE double) */
654 HReg reg;
655 PPCAMode* addr;
cerion094d1392005-06-20 13:45:57 +0000656 } FpLdSt;
sewardj92923de2006-01-25 21:29:48 +0000657 struct {
658 HReg addr; /* int reg */
659 HReg data; /* float reg */
660 } FpSTFIW;
661 /* Round 64-bit FP value to 32-bit FP value in an FP reg. */
cerion094d1392005-06-20 13:45:57 +0000662 struct {
663 HReg src;
664 HReg dst;
sewardj92923de2006-01-25 21:29:48 +0000665 } FpRSP;
sewardj7d810d72011-05-08 22:05:10 +0000666 /* fcfid[u,s,us]/fctid[u]/fctiw[u]. Only some combinations
667 of the various fields are allowed. This is asserted for
668 and documented in the code for the constructor,
669 PPCInstr_FpCftI, in host_ppc_defs.c. */
cerion094d1392005-06-20 13:45:57 +0000670 struct {
sewardj7d810d72011-05-08 22:05:10 +0000671 Bool fromI; /* True== I->F, False== F->I */
672 Bool int32; /* True== I is 32, False== I is 64 */
sewardj66d5ef22011-04-15 11:55:00 +0000673 Bool syned;
sewardj7d810d72011-05-08 22:05:10 +0000674 Bool flt64; /* True== F is 64, False== F is 32 */
cerion094d1392005-06-20 13:45:57 +0000675 HReg src;
676 HReg dst;
sewardj92923de2006-01-25 21:29:48 +0000677 } FpCftI;
678 /* FP mov src to dst on the given condition. */
cerion094d1392005-06-20 13:45:57 +0000679 struct {
cerion5b2325f2005-12-23 00:55:09 +0000680 PPCCondCode cond;
681 HReg dst;
682 HReg src;
cerion094d1392005-06-20 13:45:57 +0000683 } FpCMov;
684 /* Load FP Status & Control Register */
685 struct {
686 HReg src;
687 } FpLdFPSCR;
sewardjb51f0f42005-07-18 11:38:02 +0000688 /* Do a compare, generating result into an int register. */
cerion094d1392005-06-20 13:45:57 +0000689 struct {
690 UChar crfD;
691 HReg dst;
692 HReg srcL;
693 HReg srcR;
694 } FpCmp;
cerioncd304492005-02-08 19:40:24 +0000695
cerion7f000af2005-02-22 20:36:49 +0000696 /* Read/Write Link Register */
697 struct {
698 Bool wrLR;
699 HReg gpr;
700 } RdWrLR;
cerionc3d8bdc2005-06-28 18:06:23 +0000701
702 /* Simplistic AltiVec */
703 struct {
cerion5b2325f2005-12-23 00:55:09 +0000704 Bool isLoad;
705 UChar sz; /* 8|16|32|128 */
706 HReg reg;
707 PPCAMode* addr;
cerionc3d8bdc2005-06-28 18:06:23 +0000708 } AvLdSt;
709 struct {
cerion5b2325f2005-12-23 00:55:09 +0000710 PPCAvOp op;
711 HReg dst;
712 HReg src;
cerionc3d8bdc2005-06-28 18:06:23 +0000713 } AvUnary;
714 struct {
cerion5b2325f2005-12-23 00:55:09 +0000715 PPCAvOp op;
716 HReg dst;
717 HReg srcL;
718 HReg srcR;
cerionc3d8bdc2005-06-28 18:06:23 +0000719 } AvBinary;
cerion6b6f59e2005-06-28 20:59:18 +0000720 struct {
cerion5b2325f2005-12-23 00:55:09 +0000721 PPCAvOp op;
722 HReg dst;
723 HReg srcL;
724 HReg srcR;
cerion6b6f59e2005-06-28 20:59:18 +0000725 } AvBin8x16;
726 struct {
cerion5b2325f2005-12-23 00:55:09 +0000727 PPCAvOp op;
728 HReg dst;
729 HReg srcL;
730 HReg srcR;
cerion6b6f59e2005-06-28 20:59:18 +0000731 } AvBin16x8;
732 struct {
cerion5b2325f2005-12-23 00:55:09 +0000733 PPCAvOp op;
734 HReg dst;
735 HReg srcL;
736 HReg srcR;
cerion6b6f59e2005-06-28 20:59:18 +0000737 } AvBin32x4;
738 struct {
cerion5b2325f2005-12-23 00:55:09 +0000739 PPCAvFpOp op;
cerion6b6f59e2005-06-28 20:59:18 +0000740 HReg dst;
741 HReg srcL;
742 HReg srcR;
743 } AvBin32Fx4;
cerion8ea0d3e2005-11-14 00:44:47 +0000744 struct {
cerion5b2325f2005-12-23 00:55:09 +0000745 PPCAvFpOp op;
cerion8ea0d3e2005-11-14 00:44:47 +0000746 HReg dst;
747 HReg src;
748 } AvUn32Fx4;
cerionc3d8bdc2005-06-28 18:06:23 +0000749 /* Perm,Sel,SlDbl,Splat are all weird AV permutations */
750 struct {
cerionc3d8bdc2005-06-28 18:06:23 +0000751 HReg dst;
752 HReg srcL;
753 HReg srcR;
cerion92d9d872005-09-15 21:58:50 +0000754 HReg ctl;
cerionc3d8bdc2005-06-28 18:06:23 +0000755 } AvPerm;
756 struct {
cerionc3d8bdc2005-06-28 18:06:23 +0000757 HReg dst;
758 HReg srcL;
759 HReg srcR;
cerion92d9d872005-09-15 21:58:50 +0000760 HReg ctl;
cerionc3d8bdc2005-06-28 18:06:23 +0000761 } AvSel;
762 struct {
763 UChar shift;
764 HReg dst;
765 HReg srcL;
766 HReg srcR;
767 } AvShlDbl;
768 struct {
769 UChar sz; /* 8,16,32 */
770 HReg dst;
cerion5b2325f2005-12-23 00:55:09 +0000771 PPCVI5s* src;
cerionc3d8bdc2005-06-28 18:06:23 +0000772 } AvSplat;
cerion6b6f59e2005-06-28 20:59:18 +0000773 /* Mov src to dst on the given condition, which may not
774 be the bogus Xcc_ALWAYS. */
775 struct {
cerion5b2325f2005-12-23 00:55:09 +0000776 PPCCondCode cond;
777 HReg dst;
778 HReg src;
cerion6b6f59e2005-06-28 20:59:18 +0000779 } AvCMov;
sewardjb51f0f42005-07-18 11:38:02 +0000780 /* Load AltiVec Status & Control Register */
cerionc3d8bdc2005-06-28 18:06:23 +0000781 struct {
782 HReg src;
783 } AvLdVSCR;
cerioncd304492005-02-08 19:40:24 +0000784 } Pin;
cerionbcf8c3e2005-02-04 16:17:07 +0000785 }
cerion5b2325f2005-12-23 00:55:09 +0000786 PPCInstr;
cerionbcf8c3e2005-02-04 16:17:07 +0000787
cerioncd304492005-02-08 19:40:24 +0000788
cerion5b2325f2005-12-23 00:55:09 +0000789extern PPCInstr* PPCInstr_LI ( HReg, ULong, Bool );
790extern PPCInstr* PPCInstr_Alu ( PPCAluOp, HReg, HReg, PPCRH* );
791extern PPCInstr* PPCInstr_Shft ( PPCShftOp, Bool sz32, HReg, HReg, PPCRH* );
792extern PPCInstr* PPCInstr_AddSubC ( Bool, Bool, HReg, HReg, HReg );
793extern PPCInstr* PPCInstr_Cmp ( Bool, Bool, UInt, HReg, PPCRH* );
794extern PPCInstr* PPCInstr_Unary ( PPCUnaryOp op, HReg dst, HReg src );
795extern PPCInstr* PPCInstr_MulL ( Bool syned, Bool hi32, Bool sz32, HReg, HReg, HReg );
796extern PPCInstr* PPCInstr_Div ( Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR );
797extern PPCInstr* PPCInstr_Call ( PPCCondCode, Addr64, UInt );
798extern PPCInstr* PPCInstr_Goto ( IRJumpKind, PPCCondCode cond, PPCRI* dst );
799extern PPCInstr* PPCInstr_CMov ( PPCCondCode, HReg dst, PPCRI* src );
sewardj7fd5bb02006-01-26 02:24:17 +0000800extern PPCInstr* PPCInstr_Load ( UChar sz,
cerion5b2325f2005-12-23 00:55:09 +0000801 HReg dst, PPCAMode* src, Bool mode64 );
sewardje9d8a262009-07-01 08:06:34 +0000802extern PPCInstr* PPCInstr_LoadL ( UChar sz,
803 HReg dst, HReg src, Bool mode64 );
cerion5b2325f2005-12-23 00:55:09 +0000804extern PPCInstr* PPCInstr_Store ( UChar sz, PPCAMode* dst,
805 HReg src, Bool mode64 );
sewardje9d8a262009-07-01 08:06:34 +0000806extern PPCInstr* PPCInstr_StoreC ( UChar sz, HReg dst, HReg src,
807 Bool mode64 );
cerion5b2325f2005-12-23 00:55:09 +0000808extern PPCInstr* PPCInstr_Set ( PPCCondCode cond, HReg dst );
809extern PPCInstr* PPCInstr_MfCR ( HReg dst );
810extern PPCInstr* PPCInstr_MFence ( void );
cerioned623db2005-06-20 12:42:04 +0000811
cerion5b2325f2005-12-23 00:55:09 +0000812extern PPCInstr* PPCInstr_FpUnary ( PPCFpOp op, HReg dst, HReg src );
813extern PPCInstr* PPCInstr_FpBinary ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR );
sewardj40c80262006-02-08 19:30:46 +0000814extern PPCInstr* PPCInstr_FpMulAcc ( PPCFpOp op, HReg dst, HReg srcML,
815 HReg srcMR, HReg srcAcc );
cerion5b2325f2005-12-23 00:55:09 +0000816extern PPCInstr* PPCInstr_FpLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* );
sewardj92923de2006-01-25 21:29:48 +0000817extern PPCInstr* PPCInstr_FpSTFIW ( HReg addr, HReg data );
818extern PPCInstr* PPCInstr_FpRSP ( HReg dst, HReg src );
sewardj66d5ef22011-04-15 11:55:00 +0000819extern PPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned,
820 Bool dst64, HReg dst, HReg src );
cerion5b2325f2005-12-23 00:55:09 +0000821extern PPCInstr* PPCInstr_FpCMov ( PPCCondCode, HReg dst, HReg src );
822extern PPCInstr* PPCInstr_FpLdFPSCR ( HReg src );
823extern PPCInstr* PPCInstr_FpCmp ( HReg dst, HReg srcL, HReg srcR );
cerionbcf8c3e2005-02-04 16:17:07 +0000824
cerion5b2325f2005-12-23 00:55:09 +0000825extern PPCInstr* PPCInstr_RdWrLR ( Bool wrLR, HReg gpr );
cerion7f000af2005-02-22 20:36:49 +0000826
cerion5b2325f2005-12-23 00:55:09 +0000827extern PPCInstr* PPCInstr_AvLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* );
828extern PPCInstr* PPCInstr_AvUnary ( PPCAvOp op, HReg dst, HReg src );
829extern PPCInstr* PPCInstr_AvBinary ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
830extern PPCInstr* PPCInstr_AvBin8x16 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
831extern PPCInstr* PPCInstr_AvBin16x8 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
832extern PPCInstr* PPCInstr_AvBin32x4 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
sewardje522d4b2011-04-26 21:36:09 +0000833extern PPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, HReg srcL, HReg srcR );
834extern PPCInstr* PPCInstr_AvUn32Fx4 ( PPCAvFpOp op, HReg dst, HReg src );
cerion5b2325f2005-12-23 00:55:09 +0000835extern PPCInstr* PPCInstr_AvPerm ( HReg dst, HReg srcL, HReg srcR, HReg ctl );
836extern PPCInstr* PPCInstr_AvSel ( HReg ctl, HReg dst, HReg srcL, HReg srcR );
837extern PPCInstr* PPCInstr_AvShlDbl ( UChar shift, HReg dst, HReg srcL, HReg srcR );
838extern PPCInstr* PPCInstr_AvSplat ( UChar sz, HReg dst, PPCVI5s* src );
839extern PPCInstr* PPCInstr_AvCMov ( PPCCondCode, HReg dst, HReg src );
840extern PPCInstr* PPCInstr_AvLdVSCR ( HReg src );
cerionbcf8c3e2005-02-04 16:17:07 +0000841
cerion5b2325f2005-12-23 00:55:09 +0000842extern void ppPPCInstr ( PPCInstr*, Bool mode64 );
cerionbcf8c3e2005-02-04 16:17:07 +0000843
844/* Some functions that insulate the register allocator from details
845 of the underlying instruction set. */
cerion5b2325f2005-12-23 00:55:09 +0000846extern void getRegUsage_PPCInstr ( HRegUsage*, PPCInstr*, Bool mode64 );
847extern void mapRegs_PPCInstr ( HRegRemap*, PPCInstr* , Bool mode64);
848extern Bool isMove_PPCInstr ( PPCInstr*, HReg*, HReg* );
849extern Int emit_PPCInstr ( UChar* buf, Int nbuf, PPCInstr*,
sewardj010ac542011-05-29 09:29:18 +0000850 Bool mode64,
851 void* dispatch_unassisted,
852 void* dispatch_assisted );
sewardj2a0cc852010-01-02 13:23:54 +0000853
854extern void genSpill_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
855 HReg rreg, Int offsetB, Bool mode64 );
856extern void genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
857 HReg rreg, Int offsetB, Bool mode64 );
858
cerion5b2325f2005-12-23 00:55:09 +0000859extern void getAllocableRegs_PPC ( Int*, HReg**, Bool mode64 );
sewardjdd40fdf2006-12-24 02:20:24 +0000860extern HInstrArray* iselSB_PPC ( IRSB*, VexArch,
sewardjaca070a2006-10-17 00:28:22 +0000861 VexArchInfo*,
sewardjdd40fdf2006-12-24 02:20:24 +0000862 VexAbiInfo* );
cerionbcf8c3e2005-02-04 16:17:07 +0000863
sewardjcef7d3e2009-07-02 12:21:59 +0000864#endif /* ndef __VEX_HOST_PPC_DEFS_H */
cerionbcf8c3e2005-02-04 16:17:07 +0000865
866/*---------------------------------------------------------------*/
sewardjcef7d3e2009-07-02 12:21:59 +0000867/*--- end host_ppc_defs.h ---*/
cerionbcf8c3e2005-02-04 16:17:07 +0000868/*---------------------------------------------------------------*/