blob: 62c15ae86546941b9ba3348687b2aa9d10d7b1dd [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
Elliott Hughesed398002017-06-21 14:41:24 -070010 Copyright (C) 2004-2017 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
cerionbcf8c3e2005-02-04 16:17:07 +000043
44/* --------- Registers. --------- */
45
sewardja5b50222015-03-26 07:18:32 +000046#define ST_IN static inline
cerionbcf8c3e2005-02-04 16:17:07 +000047
sewardja5b50222015-03-26 07:18:32 +000048#define GPR(_mode64, _enc, _ix64, _ix32) \
49 mkHReg(False, (_mode64) ? HRcInt64 : HRcInt32, \
50 (_enc), (_mode64) ? (_ix64) : (_ix32))
cerionbcf8c3e2005-02-04 16:17:07 +000051
sewardja5b50222015-03-26 07:18:32 +000052#define FPR(_mode64, _enc, _ix64, _ix32) \
53 mkHReg(False, HRcFlt64, \
54 (_enc), (_mode64) ? (_ix64) : (_ix32))
cerionbcf8c3e2005-02-04 16:17:07 +000055
sewardja5b50222015-03-26 07:18:32 +000056#define VR(_mode64, _enc, _ix64, _ix32) \
57 mkHReg(False, HRcVec128, \
58 (_enc), (_mode64) ? (_ix64) : (_ix32))
cerionbcf8c3e2005-02-04 16:17:07 +000059
sewardja5b50222015-03-26 07:18:32 +000060ST_IN HReg hregPPC_GPR3 ( Bool mode64 ) { return GPR(mode64, 3, 0, 0); }
61ST_IN HReg hregPPC_GPR4 ( Bool mode64 ) { return GPR(mode64, 4, 1, 1); }
62ST_IN HReg hregPPC_GPR5 ( Bool mode64 ) { return GPR(mode64, 5, 2, 2); }
63ST_IN HReg hregPPC_GPR6 ( Bool mode64 ) { return GPR(mode64, 6, 3, 3); }
64ST_IN HReg hregPPC_GPR7 ( Bool mode64 ) { return GPR(mode64, 7, 4, 4); }
65ST_IN HReg hregPPC_GPR8 ( Bool mode64 ) { return GPR(mode64, 8, 5, 5); }
66ST_IN HReg hregPPC_GPR9 ( Bool mode64 ) { return GPR(mode64, 9, 6, 6); }
67ST_IN HReg hregPPC_GPR10 ( Bool mode64 ) { return GPR(mode64, 10, 7, 7); }
68
69// r11 and r12 are only allocatable in 32-bit mode. Hence the 64-bit
70// index numbering doesn't advance for these two.
71ST_IN HReg hregPPC_GPR11 ( Bool mode64 ) { return GPR(mode64, 11, 0, 8); }
72ST_IN HReg hregPPC_GPR12 ( Bool mode64 ) { return GPR(mode64, 12, 0, 9); }
73
74ST_IN HReg hregPPC_GPR14 ( Bool mode64 ) { return GPR(mode64, 14, 8, 10); }
75ST_IN HReg hregPPC_GPR15 ( Bool mode64 ) { return GPR(mode64, 15, 9, 11); }
76ST_IN HReg hregPPC_GPR16 ( Bool mode64 ) { return GPR(mode64, 16, 10, 12); }
77ST_IN HReg hregPPC_GPR17 ( Bool mode64 ) { return GPR(mode64, 17, 11, 13); }
78ST_IN HReg hregPPC_GPR18 ( Bool mode64 ) { return GPR(mode64, 18, 12, 14); }
79ST_IN HReg hregPPC_GPR19 ( Bool mode64 ) { return GPR(mode64, 19, 13, 15); }
80ST_IN HReg hregPPC_GPR20 ( Bool mode64 ) { return GPR(mode64, 20, 14, 16); }
81ST_IN HReg hregPPC_GPR21 ( Bool mode64 ) { return GPR(mode64, 21, 15, 17); }
82ST_IN HReg hregPPC_GPR22 ( Bool mode64 ) { return GPR(mode64, 22, 16, 18); }
83ST_IN HReg hregPPC_GPR23 ( Bool mode64 ) { return GPR(mode64, 23, 17, 19); }
84ST_IN HReg hregPPC_GPR24 ( Bool mode64 ) { return GPR(mode64, 24, 18, 20); }
85ST_IN HReg hregPPC_GPR25 ( Bool mode64 ) { return GPR(mode64, 25, 19, 21); }
86ST_IN HReg hregPPC_GPR26 ( Bool mode64 ) { return GPR(mode64, 26, 20, 22); }
87ST_IN HReg hregPPC_GPR27 ( Bool mode64 ) { return GPR(mode64, 27, 21, 23); }
88ST_IN HReg hregPPC_GPR28 ( Bool mode64 ) { return GPR(mode64, 28, 22, 24); }
89
90ST_IN HReg hregPPC_FPR14 ( Bool mode64 ) { return FPR(mode64, 14, 23, 25); }
91ST_IN HReg hregPPC_FPR15 ( Bool mode64 ) { return FPR(mode64, 15, 24, 26); }
92ST_IN HReg hregPPC_FPR16 ( Bool mode64 ) { return FPR(mode64, 16, 25, 27); }
93ST_IN HReg hregPPC_FPR17 ( Bool mode64 ) { return FPR(mode64, 17, 26, 28); }
94ST_IN HReg hregPPC_FPR18 ( Bool mode64 ) { return FPR(mode64, 18, 27, 29); }
95ST_IN HReg hregPPC_FPR19 ( Bool mode64 ) { return FPR(mode64, 19, 28, 30); }
96ST_IN HReg hregPPC_FPR20 ( Bool mode64 ) { return FPR(mode64, 20, 29, 31); }
97ST_IN HReg hregPPC_FPR21 ( Bool mode64 ) { return FPR(mode64, 21, 30, 32); }
98
99ST_IN HReg hregPPC_VR20 ( Bool mode64 ) { return VR (mode64, 20, 31, 33); }
100ST_IN HReg hregPPC_VR21 ( Bool mode64 ) { return VR (mode64, 21, 32, 34); }
101ST_IN HReg hregPPC_VR22 ( Bool mode64 ) { return VR (mode64, 22, 33, 35); }
102ST_IN HReg hregPPC_VR23 ( Bool mode64 ) { return VR (mode64, 23, 34, 36); }
103ST_IN HReg hregPPC_VR24 ( Bool mode64 ) { return VR (mode64, 24, 35, 37); }
104ST_IN HReg hregPPC_VR25 ( Bool mode64 ) { return VR (mode64, 25, 36, 38); }
105ST_IN HReg hregPPC_VR26 ( Bool mode64 ) { return VR (mode64, 26, 37, 39); }
106ST_IN HReg hregPPC_VR27 ( Bool mode64 ) { return VR (mode64, 27, 38, 40); }
107
108ST_IN HReg hregPPC_GPR1 ( Bool mode64 ) { return GPR(mode64, 1, 39, 41); }
109ST_IN HReg hregPPC_GPR29 ( Bool mode64 ) { return GPR(mode64, 29, 40, 42); }
110ST_IN HReg hregPPC_GPR30 ( Bool mode64 ) { return GPR(mode64, 30, 41, 43); }
111ST_IN HReg hregPPC_GPR31 ( Bool mode64 ) { return GPR(mode64, 31, 42, 44); }
112ST_IN HReg hregPPC_VR29 ( Bool mode64 ) { return VR (mode64, 29, 43, 45); }
113
114#undef ST_IN
115#undef GPR
116#undef FPR
117#undef VR
cerionbcf8c3e2005-02-04 16:17:07 +0000118
cerionf0de28c2005-12-13 20:21:11 +0000119#define StackFramePtr(_mode64) hregPPC_GPR1(_mode64)
120#define GuestStatePtr(_mode64) hregPPC_GPR31(_mode64)
cerionbcf8c3e2005-02-04 16:17:07 +0000121
sewardja5b50222015-03-26 07:18:32 +0000122/* Num registers used for function calls */
123#define PPC_N_REGPARMS 8
124
125extern void ppHRegPPC ( HReg );
cerion2c49e032005-02-09 17:29:49 +0000126
127
sewardjb51f0f42005-07-18 11:38:02 +0000128/* --------- Condition codes --------- */
cerion2c49e032005-02-09 17:29:49 +0000129
sewardjb51f0f42005-07-18 11:38:02 +0000130/* This gives names from bitfields in CR; hence it names BI numbers */
131/* Using IBM/hardware indexing convention */
cerion2c49e032005-02-09 17:29:49 +0000132typedef
sewardjb51f0f42005-07-18 11:38:02 +0000133 enum {
134 // CR7, which we use for integer compares
135 Pcf_7LT = 28, /* neg | lt */
136 Pcf_7GT = 29, /* pos | gt */
137 Pcf_7EQ = 30, /* zero | equal */
sewardj7e308072011-05-04 09:50:48 +0000138 Pcf_7SO = 31, /* summary overflow */
139 Pcf_NONE = 32 /* no condition; used with Pct_ALWAYS */
cerionab9132d2005-02-15 15:46:59 +0000140 }
cerion5b2325f2005-12-23 00:55:09 +0000141 PPCCondFlag;
cerion2c49e032005-02-09 17:29:49 +0000142
cerionab9132d2005-02-15 15:46:59 +0000143typedef
cerion7cf8e4e2005-02-16 16:08:17 +0000144 enum { /* Maps bc bitfield BO */
sewardj7e308072011-05-04 09:50:48 +0000145 Pct_FALSE = 0x4, /* associated PPCCondFlag must not be Pcf_NONE */
146 Pct_TRUE = 0xC, /* associated PPCCondFlag must not be Pcf_NONE */
147 Pct_ALWAYS = 0x14 /* associated PPCCondFlag must be Pcf_NONE */
cerionab9132d2005-02-15 15:46:59 +0000148 }
cerion5b2325f2005-12-23 00:55:09 +0000149 PPCCondTest;
cerionab9132d2005-02-15 15:46:59 +0000150
151typedef
152 struct {
cerion5b2325f2005-12-23 00:55:09 +0000153 PPCCondFlag flag;
154 PPCCondTest test;
cerion2c49e032005-02-09 17:29:49 +0000155 }
cerion5b2325f2005-12-23 00:55:09 +0000156 PPCCondCode;
cerion2c49e032005-02-09 17:29:49 +0000157
florian55085f82012-11-21 00:36:55 +0000158extern const HChar* showPPCCondCode ( PPCCondCode );
cerionbcf8c3e2005-02-04 16:17:07 +0000159
cerion7cf8e4e2005-02-16 16:08:17 +0000160/* constructor */
cerion5b2325f2005-12-23 00:55:09 +0000161extern PPCCondCode mk_PPCCondCode ( PPCCondTest, PPCCondFlag );
cerion7cf8e4e2005-02-16 16:08:17 +0000162
163/* false->true, true->false */
cerion5b2325f2005-12-23 00:55:09 +0000164extern PPCCondTest invertCondTest ( PPCCondTest );
cerionbcf8c3e2005-02-04 16:17:07 +0000165
cerionab9132d2005-02-15 15:46:59 +0000166
167
cerion33aa6da2005-02-16 10:25:26 +0000168
cerionbcf8c3e2005-02-04 16:17:07 +0000169/* --------- Memory address expressions (amodes). --------- */
170
171typedef
172 enum {
sewardj92923de2006-01-25 21:29:48 +0000173 Pam_IR=1, /* Immediate (signed 16-bit) + Reg */
174 Pam_RR=2 /* Reg1 + Reg2 */
cerionbcf8c3e2005-02-04 16:17:07 +0000175 }
cerion5b2325f2005-12-23 00:55:09 +0000176 PPCAModeTag;
cerionbcf8c3e2005-02-04 16:17:07 +0000177
178typedef
179 struct {
cerion5b2325f2005-12-23 00:55:09 +0000180 PPCAModeTag tag;
cerionbcf8c3e2005-02-04 16:17:07 +0000181 union {
182 struct {
183 HReg base;
sewardja5f957d2005-07-02 01:29:32 +0000184 Int index;
cerionbcf8c3e2005-02-04 16:17:07 +0000185 } IR;
186 struct {
187 HReg base;
188 HReg index;
189 } RR;
190 } Pam;
191 }
cerion5b2325f2005-12-23 00:55:09 +0000192 PPCAMode;
cerionbcf8c3e2005-02-04 16:17:07 +0000193
cerion5b2325f2005-12-23 00:55:09 +0000194extern PPCAMode* PPCAMode_IR ( Int, HReg );
195extern PPCAMode* PPCAMode_RR ( HReg, HReg );
cerionbcf8c3e2005-02-04 16:17:07 +0000196
cerion5b2325f2005-12-23 00:55:09 +0000197extern PPCAMode* dopyPPCAMode ( PPCAMode* );
cerionbcf8c3e2005-02-04 16:17:07 +0000198
cerion5b2325f2005-12-23 00:55:09 +0000199extern void ppPPCAMode ( PPCAMode* );
cerionbcf8c3e2005-02-04 16:17:07 +0000200
201
sewardjb51f0f42005-07-18 11:38:02 +0000202/* --------- Operand, which can be a reg or a u16/s16. --------- */
203/* ("RH" == "Register or Halfword immediate") */
cerionbcf8c3e2005-02-04 16:17:07 +0000204typedef
205 enum {
sewardj92923de2006-01-25 21:29:48 +0000206 Prh_Imm=3,
207 Prh_Reg=4
cerionbcf8c3e2005-02-04 16:17:07 +0000208 }
cerion5b2325f2005-12-23 00:55:09 +0000209 PPCRHTag;
sewardjb51f0f42005-07-18 11:38:02 +0000210
211typedef
212 struct {
cerion5b2325f2005-12-23 00:55:09 +0000213 PPCRHTag tag;
sewardjb51f0f42005-07-18 11:38:02 +0000214 union {
215 struct {
216 Bool syned;
217 UShort imm16;
218 } Imm;
219 struct {
220 HReg reg;
221 } Reg;
222 }
223 Prh;
224 }
cerion5b2325f2005-12-23 00:55:09 +0000225 PPCRH;
sewardjb51f0f42005-07-18 11:38:02 +0000226
cerion5b2325f2005-12-23 00:55:09 +0000227extern PPCRH* PPCRH_Imm ( Bool, UShort );
228extern PPCRH* PPCRH_Reg ( HReg );
sewardjb51f0f42005-07-18 11:38:02 +0000229
cerion5b2325f2005-12-23 00:55:09 +0000230extern void ppPPCRH ( PPCRH* );
sewardjb51f0f42005-07-18 11:38:02 +0000231
232
cerionf0de28c2005-12-13 20:21:11 +0000233/* --------- Operand, which can be a reg or a u32/64. --------- */
sewardjb51f0f42005-07-18 11:38:02 +0000234
235typedef
236 enum {
sewardj92923de2006-01-25 21:29:48 +0000237 Pri_Imm=5,
238 Pri_Reg=6
sewardjb51f0f42005-07-18 11:38:02 +0000239 }
cerion5b2325f2005-12-23 00:55:09 +0000240 PPCRITag;
cerionbcf8c3e2005-02-04 16:17:07 +0000241
242typedef
243 struct {
cerion5b2325f2005-12-23 00:55:09 +0000244 PPCRITag tag;
cerionbcf8c3e2005-02-04 16:17:07 +0000245 union {
cerionf0de28c2005-12-13 20:21:11 +0000246 ULong Imm;
247 HReg Reg;
cerionbcf8c3e2005-02-04 16:17:07 +0000248 }
249 Pri;
250 }
cerion5b2325f2005-12-23 00:55:09 +0000251 PPCRI;
cerionbcf8c3e2005-02-04 16:17:07 +0000252
cerion5b2325f2005-12-23 00:55:09 +0000253extern PPCRI* PPCRI_Imm ( ULong );
sewardj478646f2008-05-01 20:13:04 +0000254extern PPCRI* PPCRI_Reg( HReg );
cerionbcf8c3e2005-02-04 16:17:07 +0000255
cerion5b2325f2005-12-23 00:55:09 +0000256extern void ppPPCRI ( PPCRI* );
cerionbcf8c3e2005-02-04 16:17:07 +0000257
258
cerion27b3d7e2005-09-14 20:35:47 +0000259/* --------- Operand, which can be a vector reg or a s6. --------- */
260/* ("VI" == "Vector Register or Immediate") */
261typedef
262 enum {
sewardj92923de2006-01-25 21:29:48 +0000263 Pvi_Imm=7,
264 Pvi_Reg=8
cerion27b3d7e2005-09-14 20:35:47 +0000265 }
cerion5b2325f2005-12-23 00:55:09 +0000266 PPCVI5sTag;
cerion27b3d7e2005-09-14 20:35:47 +0000267
268typedef
269 struct {
cerion5b2325f2005-12-23 00:55:09 +0000270 PPCVI5sTag tag;
cerion27b3d7e2005-09-14 20:35:47 +0000271 union {
272 Char Imm5s;
273 HReg Reg;
274 }
275 Pvi;
276 }
cerion5b2325f2005-12-23 00:55:09 +0000277 PPCVI5s;
cerion27b3d7e2005-09-14 20:35:47 +0000278
cerion5b2325f2005-12-23 00:55:09 +0000279extern PPCVI5s* PPCVI5s_Imm ( Char );
280extern PPCVI5s* PPCVI5s_Reg ( HReg );
cerion27b3d7e2005-09-14 20:35:47 +0000281
cerion5b2325f2005-12-23 00:55:09 +0000282extern void ppPPCVI5s ( PPCVI5s* );
cerion27b3d7e2005-09-14 20:35:47 +0000283
284
cerioncd304492005-02-08 19:40:24 +0000285/* --------- Instructions. --------- */
cerionbcf8c3e2005-02-04 16:17:07 +0000286
cerion2c49e032005-02-09 17:29:49 +0000287/* --------- */
288typedef
289 enum {
290 Pun_NEG,
cerione13bb312005-02-10 19:51:03 +0000291 Pun_NOT,
cerion07b07a92005-12-22 14:32:35 +0000292 Pun_CLZ32,
sewardj7fd5bb02006-01-26 02:24:17 +0000293 Pun_CLZ64,
Elliott Hughesa0664b92017-04-18 17:46:52 -0700294 Pun_CTZ32,
295 Pun_CTZ64,
sewardj7fd5bb02006-01-26 02:24:17 +0000296 Pun_EXTSW
cerion2c49e032005-02-09 17:29:49 +0000297 }
cerion5b2325f2005-12-23 00:55:09 +0000298 PPCUnaryOp;
cerion2c49e032005-02-09 17:29:49 +0000299
florian55085f82012-11-21 00:36:55 +0000300extern const HChar* showPPCUnaryOp ( PPCUnaryOp );
cerioncd304492005-02-08 19:40:24 +0000301
302
303/* --------- */
304typedef
305 enum {
306 Palu_INVALID,
sewardjb51f0f42005-07-18 11:38:02 +0000307 Palu_ADD, Palu_SUB,
308 Palu_AND, Palu_OR, Palu_XOR,
cerioncd304492005-02-08 19:40:24 +0000309 }
cerion5b2325f2005-12-23 00:55:09 +0000310 PPCAluOp;
cerioncd304492005-02-08 19:40:24 +0000311
sewardjb51f0f42005-07-18 11:38:02 +0000312extern
florian55085f82012-11-21 00:36:55 +0000313const HChar* showPPCAluOp ( PPCAluOp,
314 Bool /* is the 2nd operand an immediate? */);
cerionbb01b7c2005-12-16 13:40:18 +0000315
316
317/* --------- */
318typedef
319 enum {
320 Pshft_INVALID,
321 Pshft_SHL, Pshft_SHR, Pshft_SAR,
322 }
cerion5b2325f2005-12-23 00:55:09 +0000323 PPCShftOp;
cerionbb01b7c2005-12-16 13:40:18 +0000324
325extern
florian55085f82012-11-21 00:36:55 +0000326const HChar* showPPCShftOp ( PPCShftOp,
327 Bool /* is the 2nd operand an immediate? */,
328 Bool /* is this a 32bit or 64bit op? */ );
cerionab9132d2005-02-15 15:46:59 +0000329
330
cerion094d1392005-06-20 13:45:57 +0000331/* --------- */
332typedef
333 enum {
334 Pfp_INVALID,
sewardj40c80262006-02-08 19:30:46 +0000335
336 /* Ternary */
sewardjc6bbd472012-04-02 10:20:48 +0000337 Pfp_MADDD, Pfp_MSUBD,
338 Pfp_MADDS, Pfp_MSUBS,
Elliott Hughesa0664b92017-04-18 17:46:52 -0700339 Pfp_FPADDQ, Pfp_FPADDQRNDODD,
340 Pfp_FPSUBQ, Pfp_FPSUBQRNDODD,
341 Pfp_FPMULQ, Pfp_FPMULQRNDODD,
342 Pfp_FPDIVQ, Pfp_FPDIVQRNDODD,
343 Pfp_FPMULADDQ, Pfp_FPMULADDQRNDODD,
344 Pfp_FPMULSUBQ, Pfp_FPMULSUBQRNDODD,
345 Pfp_FPNEGMULADDQ, Pfp_FPNEGMULADDQRNDODD,
346 Pfp_FPNEGMULSUBQ, Pfp_FPNEGMULSUBQRNDODD,
347 Pfp_FPSQRTQ, Pfp_FPSQRTQRNDODD,
348 Pfp_FPQTOD, Pfp_FPQTODRNDODD,
349 Pfp_FPQTOW, Pfp_FPQTOWRNDODD,
350 Pfp_FPDTOQ,
351 Pfp_IDSTOQ,
352 Pfp_IDUTOQ,
353 Pfp_TRUNCFPQTOISD,
354 Pfp_TRUNCFPQTOISW,
355 Pfp_TRUNCFPQTOIUD,
356 Pfp_TRUNCFPQTOIUW,
sewardjc6bbd472012-04-02 10:20:48 +0000357 Pfp_DFPADD, Pfp_DFPADDQ,
358 Pfp_DFPSUB, Pfp_DFPSUBQ,
359 Pfp_DFPMUL, Pfp_DFPMULQ,
360 Pfp_DFPDIV, Pfp_DFPDIVQ,
361 Pfp_DQUAQ, Pfp_DRRNDQ,
sewardj40c80262006-02-08 19:30:46 +0000362
cerion094d1392005-06-20 13:45:57 +0000363 /* Binary */
sewardj26217b02012-04-12 17:19:48 +0000364 Pfp_ADDD, Pfp_SUBD, Pfp_MULD, Pfp_DIVD,
365 Pfp_ADDS, Pfp_SUBS, Pfp_MULS, Pfp_DIVS,
sewardjcdc376d2012-04-23 11:21:12 +0000366 Pfp_DRSP, Pfp_DRDPQ, Pfp_DCTFIX, Pfp_DCTFIXQ, Pfp_DCFFIX,
carllcea07cc2013-01-22 20:25:31 +0000367 Pfp_DQUA, Pfp_RRDTR, Pfp_DIEX, Pfp_DIEXQ, Pfp_DRINTN,
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,
sewardj26217b02012-04-12 17:19:48 +0000371 Pfp_FRIN, Pfp_FRIM, Pfp_FRIP, Pfp_FRIZ,
sewardjcdc376d2012-04-23 11:21:12 +0000372 Pfp_DSCLI, Pfp_DSCRI, Pfp_DSCLIQ, Pfp_DSCRIQ, Pfp_DCTDP,
373 Pfp_DCTQPQ, Pfp_DCFFIXQ, Pfp_DXEX, Pfp_DXEXQ,
374
cerion094d1392005-06-20 13:45:57 +0000375 }
cerion5b2325f2005-12-23 00:55:09 +0000376 PPCFpOp;
cerion094d1392005-06-20 13:45:57 +0000377
florian55085f82012-11-21 00:36:55 +0000378extern const HChar* showPPCFpOp ( PPCFpOp );
cerionbcf8c3e2005-02-04 16:17:07 +0000379
380
381/* --------- */
382typedef
383 enum {
cerionc3d8bdc2005-06-28 18:06:23 +0000384 Pav_INVALID,
385
386 /* Integer Unary */
387 Pav_MOV, /* Mov */
388 Pav_NOT, /* Bitwise */
389 Pav_UNPCKH8S, Pav_UNPCKH16S, /* Unpack */
390 Pav_UNPCKL8S, Pav_UNPCKL16S,
391 Pav_UNPCKHPIX, Pav_UNPCKLPIX,
392
393 /* Integer Binary */
cerion8ea0d3e2005-11-14 00:44:47 +0000394 Pav_AND, Pav_OR, Pav_XOR, /* Bitwise */
cerionf34ccc42005-09-16 08:55:50 +0000395 Pav_ADDU, Pav_QADDU, Pav_QADDS,
cerionf34ccc42005-09-16 08:55:50 +0000396 Pav_SUBU, Pav_QSUBU, Pav_QSUBS,
carll48ae46b2013-10-01 15:45:54 +0000397 Pav_MULU,
cerion6b6f59e2005-06-28 20:59:18 +0000398 Pav_OMULU, Pav_OMULS, Pav_EMULU, Pav_EMULS,
cerion6b6f59e2005-06-28 20:59:18 +0000399 Pav_AVGU, Pav_AVGS,
400 Pav_MAXU, Pav_MAXS,
401 Pav_MINU, Pav_MINS,
cerionc3d8bdc2005-06-28 18:06:23 +0000402
403 /* Compare (always affects CR field 6) */
cerion6b6f59e2005-06-28 20:59:18 +0000404 Pav_CMPEQU, Pav_CMPGTU, Pav_CMPGTS,
cerionc3d8bdc2005-06-28 18:06:23 +0000405
406 /* Shift */
cerion6b6f59e2005-06-28 20:59:18 +0000407 Pav_SHL, Pav_SHR, Pav_SAR, Pav_ROTL,
cerionc3d8bdc2005-06-28 18:06:23 +0000408
409 /* Pack */
cerionf34ccc42005-09-16 08:55:50 +0000410 Pav_PACKUU, Pav_QPACKUU, Pav_QPACKSU, Pav_QPACKSS,
cerion6b6f59e2005-06-28 20:59:18 +0000411 Pav_PACKPXL,
cerionc3d8bdc2005-06-28 18:06:23 +0000412
413 /* Merge */
cerion6b6f59e2005-06-28 20:59:18 +0000414 Pav_MRGHI, Pav_MRGLO,
carll48ae46b2013-10-01 15:45:54 +0000415
416 /* Concatenation */
417 Pav_CATODD, Pav_CATEVEN,
carll7deaf952013-10-15 18:11:20 +0000418
419 /* Polynomial Multipy-Add */
420 Pav_POLYMULADD,
421
422 /* Cipher */
423 Pav_CIPHERV128, Pav_CIPHERLV128, Pav_NCIPHERV128, Pav_NCIPHERLV128,
424 Pav_CIPHERSUBV128,
425
426 /* Hash */
427 Pav_SHA256, Pav_SHA512,
428
429 /* BCD Arithmetic */
430 Pav_BCDAdd, Pav_BCDSub,
431
Elliott Hughesa0664b92017-04-18 17:46:52 -0700432 /* Conversion signed 128-bit value to signed BCD 128-bit */
433 Pav_I128StoBCD128,
434
435 /* Conversion signed BCD 128-bit to signed 128-bit value */
436 Pav_BCD128toI128S,
437
carll7deaf952013-10-15 18:11:20 +0000438 /* zero count */
439 Pav_ZEROCNTBYTE, Pav_ZEROCNTWORD, Pav_ZEROCNTHALF, Pav_ZEROCNTDBL,
carll60c6bac2013-10-18 01:19:06 +0000440
Elliott Hughesa0664b92017-04-18 17:46:52 -0700441 /* trailing zero count */
442 Pav_TRAILINGZEROCNTBYTE, Pav_TRAILINGZEROCNTWORD,
443 Pav_TRAILINGZEROCNTHALF, Pav_TRAILINGZEROCNTDBL,
444
carll60c6bac2013-10-18 01:19:06 +0000445 /* Vector bit matrix transpose by byte */
446 Pav_BITMTXXPOSE,
Elliott Hughesa0664b92017-04-18 17:46:52 -0700447
448 /* Vector Half-precision format to single precision conversion */
449 Pav_F16toF32x4,
450
451 /* Vector Single precision format to Half-precision conversion */
452 Pav_F32toF16x4,
453
454 /* Vector Half-precision format to Double precision conversion */
455 Pav_F16toF64x2,
456
457 /* Vector Double precision format to Half-precision conversion */
458 Pav_F64toF16x2,
459
460 /* 128 bit mult by 10 */
461 Pav_MulI128by10,
462
463 /* 128 bit mult by 10, carry out */
464 Pav_MulI128by10Carry,
465
466 /* 128 bit mult by 10 plus carry in */
467 Pav_MulI128by10E,
468
469 /* 128 bit mult by 10 plus carry in, carry out */
470 Pav_MulI128by10ECarry,
471
472 /* F128 to I128 */
473 Pav_F128toI128S,
474
475 /* Round F128 to F128 */
476 Pav_ROUNDFPQ,
cerionc3d8bdc2005-06-28 18:06:23 +0000477 }
cerion5b2325f2005-12-23 00:55:09 +0000478 PPCAvOp;
cerionc3d8bdc2005-06-28 18:06:23 +0000479
florian55085f82012-11-21 00:36:55 +0000480extern const HChar* showPPCAvOp ( PPCAvOp );
cerionc3d8bdc2005-06-28 18:06:23 +0000481
482
483/* --------- */
484typedef
485 enum {
cerion8ea0d3e2005-11-14 00:44:47 +0000486 Pavfp_INVALID,
487
488 /* Floating point binary */
489 Pavfp_ADDF, Pavfp_SUBF, Pavfp_MULF,
490 Pavfp_MAXF, Pavfp_MINF,
491 Pavfp_CMPEQF, Pavfp_CMPGTF, Pavfp_CMPGEF,
492
493 /* Floating point unary */
494 Pavfp_RCPF, Pavfp_RSQRTF,
ceriond963eb42005-11-16 18:02:58 +0000495 Pavfp_CVTU2F, Pavfp_CVTS2F, Pavfp_QCVTF2U, Pavfp_QCVTF2S,
496 Pavfp_ROUNDM, Pavfp_ROUNDP, Pavfp_ROUNDN, Pavfp_ROUNDZ,
cerion8ea0d3e2005-11-14 00:44:47 +0000497 }
cerion5b2325f2005-12-23 00:55:09 +0000498 PPCAvFpOp;
cerion8ea0d3e2005-11-14 00:44:47 +0000499
florian55085f82012-11-21 00:36:55 +0000500extern const HChar* showPPCAvFpOp ( PPCAvFpOp );
cerion8ea0d3e2005-11-14 00:44:47 +0000501
502
503/* --------- */
504typedef
505 enum {
cerionf0de28c2005-12-13 20:21:11 +0000506 Pin_LI, /* load word (32/64-bit) immediate (fake insn) */
cerionbb01b7c2005-12-16 13:40:18 +0000507 Pin_Alu, /* word add/sub/and/or/xor */
508 Pin_Shft, /* word shl/shr/sar */
cerion5b2325f2005-12-23 00:55:09 +0000509 Pin_AddSubC, /* add/sub with read/write carry */
cerionf0de28c2005-12-13 20:21:11 +0000510 Pin_Cmp, /* word compare */
511 Pin_Unary, /* not, neg, clz */
cerioned623db2005-06-20 12:42:04 +0000512 Pin_MulL, /* widening multiply */
513 Pin_Div, /* div */
514 Pin_Call, /* call to address in register */
sewardj3dee8492012-04-20 00:13:28 +0000515 Pin_XDirect, /* direct transfer to GA */
516 Pin_XIndir, /* indirect transfer to GA */
517 Pin_XAssisted, /* assisted transfer to GA */
cerionf0de28c2005-12-13 20:21:11 +0000518 Pin_CMov, /* conditional move */
sewardj7fd5bb02006-01-26 02:24:17 +0000519 Pin_Load, /* zero-extending load a 8|16|32|64 bit value from mem */
sewardje9d8a262009-07-01 08:06:34 +0000520 Pin_LoadL, /* load-linked (lwarx/ldarx) 32|64 bit value from mem */
cerion5b2325f2005-12-23 00:55:09 +0000521 Pin_Store, /* store a 8|16|32|64 bit value to mem */
sewardje9d8a262009-07-01 08:06:34 +0000522 Pin_StoreC, /* store-conditional (stwcx./stdcx.) 32|64 bit val */
cerion5b2325f2005-12-23 00:55:09 +0000523 Pin_Set, /* convert condition code to value 0 or 1 */
sewardjb51f0f42005-07-18 11:38:02 +0000524 Pin_MfCR, /* move from condition register to GPR */
525 Pin_MFence, /* mem fence */
cerionc3d8bdc2005-06-28 18:06:23 +0000526
cerion094d1392005-06-20 13:45:57 +0000527 Pin_FpUnary, /* FP unary op */
528 Pin_FpBinary, /* FP binary op */
Elliott Hughesa0664b92017-04-18 17:46:52 -0700529 Pin_Fp128Unary, /* FP unary op for 128-bit floating point */
530 Pin_Fp128Binary, /* FP binary op for 128-bit floating point */
531 Pin_Fp128Trinary, /* FP trinary op for 128-bit floating point */
sewardj40c80262006-02-08 19:30:46 +0000532 Pin_FpMulAcc, /* FP multipy-accumulate style op */
cerion094d1392005-06-20 13:45:57 +0000533 Pin_FpLdSt, /* FP load/store */
sewardj92923de2006-01-25 21:29:48 +0000534 Pin_FpSTFIW, /* stfiwx */
535 Pin_FpRSP, /* FP round IEEE754 double to IEEE754 single */
sewardj7d810d72011-05-08 22:05:10 +0000536 Pin_FpCftI, /* fcfid[u,s,us]/fctid[u]/fctiw[u] */
cerion094d1392005-06-20 13:45:57 +0000537 Pin_FpCMov, /* FP floating point conditional move */
538 Pin_FpLdFPSCR, /* mtfsf */
539 Pin_FpCmp, /* FP compare, generating value into int reg */
sewardj92923de2006-01-25 21:29:48 +0000540
cerionc3d8bdc2005-06-28 18:06:23 +0000541 Pin_RdWrLR, /* Read/Write Link Register */
542
cerionc3d8bdc2005-06-28 18:06:23 +0000543 Pin_AvLdSt, /* AV load/store (kludging for AMode_IR) */
544 Pin_AvUnary, /* AV unary general reg=>reg */
cerion6b6f59e2005-06-28 20:59:18 +0000545
cerionc3d8bdc2005-06-28 18:06:23 +0000546 Pin_AvBinary, /* AV binary general reg,reg=>reg */
Elliott Hughesa0664b92017-04-18 17:46:52 -0700547 Pin_AvBinaryInt,/* AV binary reg,int=>reg */
cerion6b6f59e2005-06-28 20:59:18 +0000548 Pin_AvBin8x16, /* AV binary, 8x4 */
549 Pin_AvBin16x8, /* AV binary, 16x4 */
550 Pin_AvBin32x4, /* AV binary, 32x4 */
carll0c74bb52013-08-12 18:01:40 +0000551 Pin_AvBin64x2, /* AV binary, 64x2 */
cerion6b6f59e2005-06-28 20:59:18 +0000552
553 Pin_AvBin32Fx4, /* AV FP binary, 32Fx4 */
cerion8ea0d3e2005-11-14 00:44:47 +0000554 Pin_AvUn32Fx4, /* AV FP unary, 32Fx4 */
cerionc3d8bdc2005-06-28 18:06:23 +0000555
556 Pin_AvPerm, /* AV permute (shuffle) */
557 Pin_AvSel, /* AV select */
carll9877fe52014-10-07 17:49:14 +0000558 Pin_AvSh, /* AV shift left or right */
cerionc3d8bdc2005-06-28 18:06:23 +0000559 Pin_AvShlDbl, /* AV shift-left double by imm */
560 Pin_AvSplat, /* One elem repeated throughout dst */
cerion6b6f59e2005-06-28 20:59:18 +0000561 Pin_AvLdVSCR, /* mtvscr */
sewardjc6bbd472012-04-02 10:20:48 +0000562 Pin_AvCMov, /* AV conditional move */
carll7deaf952013-10-15 18:11:20 +0000563 Pin_AvCipherV128Unary, /* AV Vector unary Cipher */
564 Pin_AvCipherV128Binary, /* AV Vector binary Cipher */
565 Pin_AvHashV128Binary, /* AV Vector binary Hash */
Elliott Hughesa0664b92017-04-18 17:46:52 -0700566 Pin_AvBCDV128Binary, /* BCD Arithmetic */
sewardjc6bbd472012-04-02 10:20:48 +0000567 Pin_Dfp64Unary, /* DFP64 unary op */
sewardj26217b02012-04-12 17:19:48 +0000568 Pin_Dfp128Unary, /* DFP128 unary op */
569 Pin_DfpShift, /* Decimal floating point shift by immediate value */
sewardjc6bbd472012-04-02 10:20:48 +0000570 Pin_Dfp64Binary, /* DFP64 binary op */
sewardj26217b02012-04-12 17:19:48 +0000571 Pin_Dfp128Binary, /* DFP128 binary op */
572 Pin_DfpShift128, /* 128-bit Decimal floating point shift by
573 * immediate value */
574 Pin_DfpD128toD64, /* DFP 128 to DFP 64 op */
575 Pin_DfpI64StoD128, /* DFP signed integer to DFP 128 */
sewardjcdc376d2012-04-23 11:21:12 +0000576 Pin_DfpRound, /* D64 round to D64 */
577 Pin_DfpRound128, /* D128 round to D128 */
578 Pin_ExtractExpD128, /* DFP, extract 64 bit exponent */
579 Pin_InsertExpD128, /* DFP, insert 64 bit exponent and 128 bit binary
580 * significand into a DFP 128-bit value*/
581 Pin_Dfp64Cmp, /* DFP 64-bit compare, generating value into
582 * int reg */
583 Pin_Dfp128Cmp, /* DFP 128-bit compare, generating value into
584 * int reg */
585 Pin_DfpQuantize, /* D64 quantize using register value, significance
586 * round */
587 Pin_DfpQuantize128, /* D128 quantize using register value, significance
588 * round */
sewardj3dee8492012-04-20 00:13:28 +0000589 Pin_EvCheck, /* Event check */
590 Pin_ProfInc /* 64-bit profile counter increment */
cerionbcf8c3e2005-02-04 16:17:07 +0000591 }
cerion5b2325f2005-12-23 00:55:09 +0000592 PPCInstrTag;
cerionbcf8c3e2005-02-04 16:17:07 +0000593
cerioncd304492005-02-08 19:40:24 +0000594/* Destinations are on the LEFT (first operand) */
cerionbcf8c3e2005-02-04 16:17:07 +0000595
596typedef
597 struct {
cerion5b2325f2005-12-23 00:55:09 +0000598 PPCInstrTag tag;
cerioncd304492005-02-08 19:40:24 +0000599 union {
cerion5b2325f2005-12-23 00:55:09 +0000600 /* Get a 32/64-bit literal into a register.
601 May turn into a number of real insns. */
sewardjb51f0f42005-07-18 11:38:02 +0000602 struct {
603 HReg dst;
cerionf0de28c2005-12-13 20:21:11 +0000604 ULong imm64;
605 } LI;
cerionbb01b7c2005-12-16 13:40:18 +0000606 /* Integer add/sub/and/or/xor. Limitations:
sewardjb51f0f42005-07-18 11:38:02 +0000607 - For add, the immediate, if it exists, is a signed 16.
608 - For sub, the immediate, if it exists, is a signed 16
609 which may not be -32768, since no such instruction
610 exists, and so we have to emit addi with +32768, but
611 that is not possible.
612 - For and/or/xor, the immediate, if it exists,
613 is an unsigned 16.
sewardjb51f0f42005-07-18 11:38:02 +0000614 */
cerioncd304492005-02-08 19:40:24 +0000615 struct {
cerion5b2325f2005-12-23 00:55:09 +0000616 PPCAluOp op;
617 HReg dst;
618 HReg srcL;
619 PPCRH* srcR;
cerionf0de28c2005-12-13 20:21:11 +0000620 } Alu;
cerionbb01b7c2005-12-16 13:40:18 +0000621 /* Integer shl/shr/sar.
622 Limitations: the immediate, if it exists,
623 is a signed 5-bit value between 1 and 31 inclusive.
624 */
625 struct {
cerion5b2325f2005-12-23 00:55:09 +0000626 PPCShftOp op;
627 Bool sz32; /* mode64 has both 32 and 64bit shft */
628 HReg dst;
629 HReg srcL;
630 PPCRH* srcR;
cerionbb01b7c2005-12-16 13:40:18 +0000631 } Shft;
cerion4a49b032005-11-08 16:23:07 +0000632 /* */
633 struct {
634 Bool isAdd; /* else sub */
635 Bool setC; /* else read carry */
636 HReg dst;
637 HReg srcL;
638 HReg srcR;
cerion5b2325f2005-12-23 00:55:09 +0000639 } AddSubC;
sewardjb51f0f42005-07-18 11:38:02 +0000640 /* If signed, the immediate, if it exists, is a signed 16,
641 else it is an unsigned 16. */
cerioncd304492005-02-08 19:40:24 +0000642 struct {
cerion5b2325f2005-12-23 00:55:09 +0000643 Bool syned;
644 Bool sz32; /* mode64 has both 32 and 64bit cmp */
645 UInt crfD;
646 HReg srcL;
647 PPCRH* srcR;
cerionf0de28c2005-12-13 20:21:11 +0000648 } Cmp;
sewardj7fd5bb02006-01-26 02:24:17 +0000649 /* Not, Neg, Clz32/64, Extsw */
cerion2c49e032005-02-09 17:29:49 +0000650 struct {
cerion5b2325f2005-12-23 00:55:09 +0000651 PPCUnaryOp op;
652 HReg dst;
653 HReg src;
654 } Unary;
cerion92f5dc72005-02-10 16:11:35 +0000655 struct {
sewardjb51f0f42005-07-18 11:38:02 +0000656 Bool syned; /* meaningless if hi32==False */
cerionf0de28c2005-12-13 20:21:11 +0000657 Bool hi; /* False=>low, True=>high */
cerionbb01b7c2005-12-16 13:40:18 +0000658 Bool sz32; /* mode64 has both 32 & 64bit mull */
sewardjb51f0f42005-07-18 11:38:02 +0000659 HReg dst;
660 HReg srcL;
661 HReg srcR;
cerion92f5dc72005-02-10 16:11:35 +0000662 } MulL;
cerion9e263e32005-03-03 17:21:51 +0000663 /* ppc32 div/divu instruction. */
cerionc0e707e2005-02-10 22:35:34 +0000664 struct {
sewardj4aa412a2011-07-24 14:13:21 +0000665 Bool extended;
cerion33aa6da2005-02-16 10:25:26 +0000666 Bool syned;
cerionbb01b7c2005-12-16 13:40:18 +0000667 Bool sz32; /* mode64 has both 32 & 64bit div */
cerion33aa6da2005-02-16 10:25:26 +0000668 HReg dst;
ceriona2f75882005-03-15 16:33:38 +0000669 HReg srcL;
670 HReg srcR;
cerionc0e707e2005-02-10 22:35:34 +0000671 } Div;
cerion2c49e032005-02-09 17:29:49 +0000672 /* Pseudo-insn. Call target (an absolute address), on given
sewardj6a64a9f2005-08-21 00:48:37 +0000673 condition (which could be Pct_ALWAYS). argiregs indicates
674 which of r3 .. r10 carries argument values for this call,
675 using a bit mask (1<<N is set if rN holds an arg, for N in
676 3 .. 10 inclusive). */
cerion2c49e032005-02-09 17:29:49 +0000677 struct {
cerion5b2325f2005-12-23 00:55:09 +0000678 PPCCondCode cond;
679 Addr64 target;
680 UInt argiregs;
sewardjcfe046e2013-01-17 14:23:53 +0000681 RetLoc rloc; /* where the return value will be */
cerion2c49e032005-02-09 17:29:49 +0000682 } Call;
sewardj3dee8492012-04-20 00:13:28 +0000683 /* Update the guest CIA value, then exit requesting to chain
684 to it. May be conditional. Use of Addr64 in order to cope
685 with 64-bit hosts. */
cerion2c49e032005-02-09 17:29:49 +0000686 struct {
sewardj3dee8492012-04-20 00:13:28 +0000687 Addr64 dstGA; /* next guest address */
688 PPCAMode* amCIA; /* amode in guest state for CIA */
689 PPCCondCode cond; /* can be ALWAYS */
690 Bool toFastEP; /* chain to the slow or fast point? */
691 } XDirect;
692 /* Boring transfer to a guest address not known at JIT time.
693 Not chainable. May be conditional. */
694 struct {
695 HReg dstGA;
696 PPCAMode* amCIA;
697 PPCCondCode cond; /* can be ALWAYS */
698 } XIndir;
699 /* Assisted transfer to a guest address, most general case.
700 Not chainable. May be conditional. */
701 struct {
702 HReg dstGA;
703 PPCAMode* amCIA;
704 PPCCondCode cond; /* can be ALWAYS */
cerion5b2325f2005-12-23 00:55:09 +0000705 IRJumpKind jk;
sewardj3dee8492012-04-20 00:13:28 +0000706 } XAssisted;
cerionb536af92005-02-10 15:03:19 +0000707 /* Mov src to dst on the given condition, which may not
cerion9abfcbc2005-02-25 11:16:58 +0000708 be the bogus Pct_ALWAYS. */
cerionb536af92005-02-10 15:03:19 +0000709 struct {
cerion5b2325f2005-12-23 00:55:09 +0000710 PPCCondCode cond;
cerioncd304492005-02-08 19:40:24 +0000711 HReg dst;
cerion5b2325f2005-12-23 00:55:09 +0000712 PPCRI* src;
713 } CMov;
sewardj7fd5bb02006-01-26 02:24:17 +0000714 /* Zero extending loads. Dst size is host word size */
cerion5b2325f2005-12-23 00:55:09 +0000715 struct {
716 UChar sz; /* 1|2|4|8 */
cerion5b2325f2005-12-23 00:55:09 +0000717 HReg dst;
718 PPCAMode* src;
cerion7cf8e4e2005-02-16 16:08:17 +0000719 } Load;
sewardje9d8a262009-07-01 08:06:34 +0000720 /* Load-and-reserve (lwarx, ldarx) */
721 struct {
722 UChar sz; /* 4|8 */
723 HReg dst;
724 HReg src;
725 } LoadL;
cerion5b2325f2005-12-23 00:55:09 +0000726 /* 64/32/16/8 bit stores */
cerioncd304492005-02-08 19:40:24 +0000727 struct {
cerion5b2325f2005-12-23 00:55:09 +0000728 UChar sz; /* 1|2|4|8 */
729 PPCAMode* dst;
730 HReg src;
cerioncd304492005-02-08 19:40:24 +0000731 } Store;
sewardje9d8a262009-07-01 08:06:34 +0000732 /* Store-conditional (stwcx., stdcx.) */
733 struct {
734 UChar sz; /* 4|8 */
735 HReg dst;
736 HReg src;
737 } StoreC;
cerion5b2325f2005-12-23 00:55:09 +0000738 /* Convert a ppc condition code to value 0 or 1. */
cerionb536af92005-02-10 15:03:19 +0000739 struct {
cerion5b2325f2005-12-23 00:55:09 +0000740 PPCCondCode cond;
741 HReg dst;
742 } Set;
sewardjb51f0f42005-07-18 11:38:02 +0000743 /* Move the entire CR to a GPR */
744 struct {
745 HReg dst;
746 } MfCR;
cerion98411db2005-02-16 14:14:49 +0000747 /* Mem fence. In short, an insn which flushes all preceding
748 loads and stores as much as possible before continuing.
cerion5b2325f2005-12-23 00:55:09 +0000749 On PPC we emit a "sync". */
cerion92f5dc72005-02-10 16:11:35 +0000750 struct {
cerion92f5dc72005-02-10 16:11:35 +0000751 } MFence;
cerioncd304492005-02-08 19:40:24 +0000752
cerion5b2325f2005-12-23 00:55:09 +0000753 /* PPC Floating point */
cerion094d1392005-06-20 13:45:57 +0000754 struct {
cerion5b2325f2005-12-23 00:55:09 +0000755 PPCFpOp op;
756 HReg dst;
757 HReg src;
cerion094d1392005-06-20 13:45:57 +0000758 } FpUnary;
759 struct {
cerion5b2325f2005-12-23 00:55:09 +0000760 PPCFpOp op;
761 HReg dst;
762 HReg srcL;
763 HReg srcR;
cerion094d1392005-06-20 13:45:57 +0000764 } FpBinary;
765 struct {
sewardj40c80262006-02-08 19:30:46 +0000766 PPCFpOp op;
Elliott Hughesa0664b92017-04-18 17:46:52 -0700767 HReg dst;
768 HReg src;
769 } Fp128Unary;
770 struct {
771 PPCFpOp op;
772 HReg dst;
773 HReg srcL;
774 HReg srcR;
775 } Fp128Binary;
776 struct {
777 PPCFpOp op;
778 HReg dst;
779 HReg srcL;
780 HReg srcR;
781 } Fp128Trinary;
782 struct {
783 PPCFpOp op;
sewardj40c80262006-02-08 19:30:46 +0000784 HReg dst;
785 HReg srcML;
786 HReg srcMR;
787 HReg srcAcc;
788 } FpMulAcc;
789 struct {
cerion5b2325f2005-12-23 00:55:09 +0000790 Bool isLoad;
791 UChar sz; /* only 4 (IEEE single) or 8 (IEEE double) */
792 HReg reg;
793 PPCAMode* addr;
cerion094d1392005-06-20 13:45:57 +0000794 } FpLdSt;
sewardj92923de2006-01-25 21:29:48 +0000795 struct {
796 HReg addr; /* int reg */
797 HReg data; /* float reg */
798 } FpSTFIW;
799 /* Round 64-bit FP value to 32-bit FP value in an FP reg. */
cerion094d1392005-06-20 13:45:57 +0000800 struct {
801 HReg src;
802 HReg dst;
sewardj92923de2006-01-25 21:29:48 +0000803 } FpRSP;
sewardj7d810d72011-05-08 22:05:10 +0000804 /* fcfid[u,s,us]/fctid[u]/fctiw[u]. Only some combinations
805 of the various fields are allowed. This is asserted for
806 and documented in the code for the constructor,
807 PPCInstr_FpCftI, in host_ppc_defs.c. */
cerion094d1392005-06-20 13:45:57 +0000808 struct {
sewardj7d810d72011-05-08 22:05:10 +0000809 Bool fromI; /* True== I->F, False== F->I */
810 Bool int32; /* True== I is 32, False== I is 64 */
sewardj66d5ef22011-04-15 11:55:00 +0000811 Bool syned;
sewardj7d810d72011-05-08 22:05:10 +0000812 Bool flt64; /* True== F is 64, False== F is 32 */
cerion094d1392005-06-20 13:45:57 +0000813 HReg src;
814 HReg dst;
sewardj92923de2006-01-25 21:29:48 +0000815 } FpCftI;
816 /* FP mov src to dst on the given condition. */
cerion094d1392005-06-20 13:45:57 +0000817 struct {
cerion5b2325f2005-12-23 00:55:09 +0000818 PPCCondCode cond;
819 HReg dst;
820 HReg src;
cerion094d1392005-06-20 13:45:57 +0000821 } FpCMov;
822 /* Load FP Status & Control Register */
823 struct {
824 HReg src;
sewardjc6bbd472012-04-02 10:20:48 +0000825 UInt dfp_rm;
cerion094d1392005-06-20 13:45:57 +0000826 } FpLdFPSCR;
sewardjb51f0f42005-07-18 11:38:02 +0000827 /* Do a compare, generating result into an int register. */
cerion094d1392005-06-20 13:45:57 +0000828 struct {
829 UChar crfD;
830 HReg dst;
831 HReg srcL;
832 HReg srcR;
833 } FpCmp;
cerioncd304492005-02-08 19:40:24 +0000834
cerion7f000af2005-02-22 20:36:49 +0000835 /* Read/Write Link Register */
836 struct {
837 Bool wrLR;
838 HReg gpr;
839 } RdWrLR;
cerionc3d8bdc2005-06-28 18:06:23 +0000840
841 /* Simplistic AltiVec */
842 struct {
cerion5b2325f2005-12-23 00:55:09 +0000843 Bool isLoad;
844 UChar sz; /* 8|16|32|128 */
845 HReg reg;
846 PPCAMode* addr;
cerionc3d8bdc2005-06-28 18:06:23 +0000847 } AvLdSt;
848 struct {
cerion5b2325f2005-12-23 00:55:09 +0000849 PPCAvOp op;
850 HReg dst;
851 HReg src;
cerionc3d8bdc2005-06-28 18:06:23 +0000852 } AvUnary;
853 struct {
cerion5b2325f2005-12-23 00:55:09 +0000854 PPCAvOp op;
855 HReg dst;
856 HReg srcL;
857 HReg srcR;
cerionc3d8bdc2005-06-28 18:06:23 +0000858 } AvBinary;
cerion6b6f59e2005-06-28 20:59:18 +0000859 struct {
cerion5b2325f2005-12-23 00:55:09 +0000860 PPCAvOp op;
861 HReg dst;
Elliott Hughesa0664b92017-04-18 17:46:52 -0700862 HReg src;
863 PPCRI* val;
864 } AvBinaryInt;
865 struct {
866 PPCAvOp op;
867 HReg dst;
cerion5b2325f2005-12-23 00:55:09 +0000868 HReg srcL;
869 HReg srcR;
cerion6b6f59e2005-06-28 20:59:18 +0000870 } AvBin8x16;
871 struct {
cerion5b2325f2005-12-23 00:55:09 +0000872 PPCAvOp op;
873 HReg dst;
874 HReg srcL;
875 HReg srcR;
cerion6b6f59e2005-06-28 20:59:18 +0000876 } AvBin16x8;
877 struct {
cerion5b2325f2005-12-23 00:55:09 +0000878 PPCAvOp op;
879 HReg dst;
880 HReg srcL;
881 HReg srcR;
cerion6b6f59e2005-06-28 20:59:18 +0000882 } AvBin32x4;
carll0c74bb52013-08-12 18:01:40 +0000883 /* Can only be generated for CPUs capable of ISA 2.07 or above */
884 struct {
885 PPCAvOp op;
886 HReg dst;
887 HReg srcL;
888 HReg srcR;
889 } AvBin64x2;
cerion6b6f59e2005-06-28 20:59:18 +0000890 struct {
cerion5b2325f2005-12-23 00:55:09 +0000891 PPCAvFpOp op;
cerion6b6f59e2005-06-28 20:59:18 +0000892 HReg dst;
893 HReg srcL;
894 HReg srcR;
895 } AvBin32Fx4;
cerion8ea0d3e2005-11-14 00:44:47 +0000896 struct {
cerion5b2325f2005-12-23 00:55:09 +0000897 PPCAvFpOp op;
cerion8ea0d3e2005-11-14 00:44:47 +0000898 HReg dst;
899 HReg src;
900 } AvUn32Fx4;
cerionc3d8bdc2005-06-28 18:06:23 +0000901 /* Perm,Sel,SlDbl,Splat are all weird AV permutations */
902 struct {
cerionc3d8bdc2005-06-28 18:06:23 +0000903 HReg dst;
904 HReg srcL;
905 HReg srcR;
cerion92d9d872005-09-15 21:58:50 +0000906 HReg ctl;
cerionc3d8bdc2005-06-28 18:06:23 +0000907 } AvPerm;
908 struct {
cerionc3d8bdc2005-06-28 18:06:23 +0000909 HReg dst;
910 HReg srcL;
911 HReg srcR;
cerion92d9d872005-09-15 21:58:50 +0000912 HReg ctl;
cerionc3d8bdc2005-06-28 18:06:23 +0000913 } AvSel;
914 struct {
carll9877fe52014-10-07 17:49:14 +0000915 Bool shLeft;
916 HReg dst;
carll99de41e2014-10-07 18:20:39 +0000917 PPCAMode* addr;
carll9877fe52014-10-07 17:49:14 +0000918 } AvSh;
919 struct {
cerionc3d8bdc2005-06-28 18:06:23 +0000920 UChar shift;
921 HReg dst;
922 HReg srcL;
923 HReg srcR;
924 } AvShlDbl;
925 struct {
926 UChar sz; /* 8,16,32 */
927 HReg dst;
cerion5b2325f2005-12-23 00:55:09 +0000928 PPCVI5s* src;
cerionc3d8bdc2005-06-28 18:06:23 +0000929 } AvSplat;
cerion6b6f59e2005-06-28 20:59:18 +0000930 /* Mov src to dst on the given condition, which may not
931 be the bogus Xcc_ALWAYS. */
932 struct {
cerion5b2325f2005-12-23 00:55:09 +0000933 PPCCondCode cond;
934 HReg dst;
935 HReg src;
cerion6b6f59e2005-06-28 20:59:18 +0000936 } AvCMov;
sewardjb51f0f42005-07-18 11:38:02 +0000937 /* Load AltiVec Status & Control Register */
cerionc3d8bdc2005-06-28 18:06:23 +0000938 struct {
939 HReg src;
940 } AvLdVSCR;
sewardjc6bbd472012-04-02 10:20:48 +0000941 struct {
carll7deaf952013-10-15 18:11:20 +0000942 PPCAvOp op;
943 HReg dst;
944 HReg src;
945 } AvCipherV128Unary;
946 struct {
947 PPCAvOp op;
948 HReg dst;
949 HReg src;
950 PPCRI* s_field;
951 } AvHashV128Binary;
952 struct {
953 PPCAvOp op;
954 HReg dst;
955 HReg src1;
956 HReg src2;
Elliott Hughesa0664b92017-04-18 17:46:52 -0700957 } AvBCDV128Binary;
carll7deaf952013-10-15 18:11:20 +0000958 struct {
959 PPCAvOp op;
960 HReg dst;
961 HReg srcL;
962 HReg srcR;
963 } AvCipherV128Binary;
964 struct {
sewardjc6bbd472012-04-02 10:20:48 +0000965 PPCFpOp op;
966 HReg dst;
967 HReg src;
968 } Dfp64Unary;
969 struct {
970 PPCFpOp op;
971 HReg dst;
972 HReg srcL;
973 HReg srcR;
974 } Dfp64Binary;
975 struct {
976 PPCFpOp op;
sewardj26217b02012-04-12 17:19:48 +0000977 HReg dst;
978 HReg src;
979 PPCRI* shift;
980 } DfpShift;
981 struct {
982 PPCFpOp op;
sewardjc6bbd472012-04-02 10:20:48 +0000983 HReg dst_hi;
984 HReg dst_lo;
985 HReg src_hi;
986 HReg src_lo;
987 } Dfp128Unary;
988 struct {
989 /* The dst is used to pass the left source operand in and return
990 * the result.
991 */
992 PPCFpOp op;
993 HReg dst_hi;
994 HReg dst_lo;
995 HReg srcR_hi;
996 HReg srcR_lo;
997 } Dfp128Binary;
sewardj26217b02012-04-12 17:19:48 +0000998 struct {
999 PPCFpOp op;
1000 HReg dst_hi;
1001 HReg dst_lo;
1002 HReg src_hi;
1003 HReg src_lo;
1004 PPCRI* shift;
1005 } DfpShift128;
1006 struct {
sewardjcdc376d2012-04-23 11:21:12 +00001007 HReg dst;
1008 HReg src;
1009 PPCRI* r_rmc;
1010 } DfpRound;
1011 struct {
1012 HReg dst_hi;
1013 HReg dst_lo;
1014 HReg src_hi;
1015 HReg src_lo;
1016 PPCRI* r_rmc;
1017 } DfpRound128;
1018 struct {
1019 PPCFpOp op;
1020 HReg dst;
1021 HReg srcL;
1022 HReg srcR;
1023 PPCRI* rmc;
1024 } DfpQuantize;
1025 struct {
1026 PPCFpOp op;
1027 HReg dst_hi;
1028 HReg dst_lo;
1029 HReg src_hi;
1030 HReg src_lo;
1031 PPCRI* rmc;
1032 } DfpQuantize128;
1033 struct {
1034 PPCFpOp op;
1035 HReg dst;
1036 HReg src_hi;
1037 HReg src_lo;
1038 } ExtractExpD128;
1039 struct {
1040 PPCFpOp op;
1041 HReg dst_hi;
1042 HReg dst_lo;
1043 HReg srcL;
1044 HReg srcR_hi;
1045 HReg srcR_lo;
1046 } InsertExpD128;
1047 struct {
sewardj26217b02012-04-12 17:19:48 +00001048 PPCFpOp op;
1049 HReg dst;
1050 HReg src_hi;
1051 HReg src_lo;
1052 } DfpD128toD64;
1053 struct {
1054 PPCFpOp op;
1055 HReg dst_hi;
1056 HReg dst_lo;
1057 HReg src;
1058 } DfpI64StoD128;
sewardj3dee8492012-04-20 00:13:28 +00001059 struct {
sewardjcdc376d2012-04-23 11:21:12 +00001060 UChar crfD;
1061 HReg dst;
1062 HReg srcL;
1063 HReg srcR;
1064 } Dfp64Cmp;
1065 struct {
1066 UChar crfD;
1067 HReg dst;
1068 HReg srcL_hi;
1069 HReg srcL_lo;
1070 HReg srcR_hi;
1071 HReg srcR_lo;
1072 } Dfp128Cmp;
1073 struct {
sewardj3dee8492012-04-20 00:13:28 +00001074 PPCAMode* amCounter;
1075 PPCAMode* amFailAddr;
1076 } EvCheck;
1077 struct {
1078 /* No fields. The address of the counter to inc is
1079 installed later, post-translation, by patching it in,
1080 as it is not known at translation time. */
1081 } ProfInc;
sewardjc6bbd472012-04-02 10:20:48 +00001082 } Pin;
cerionbcf8c3e2005-02-04 16:17:07 +00001083 }
cerion5b2325f2005-12-23 00:55:09 +00001084 PPCInstr;
cerionbcf8c3e2005-02-04 16:17:07 +00001085
cerioncd304492005-02-08 19:40:24 +00001086
cerion5b2325f2005-12-23 00:55:09 +00001087extern PPCInstr* PPCInstr_LI ( HReg, ULong, Bool );
1088extern PPCInstr* PPCInstr_Alu ( PPCAluOp, HReg, HReg, PPCRH* );
1089extern PPCInstr* PPCInstr_Shft ( PPCShftOp, Bool sz32, HReg, HReg, PPCRH* );
1090extern PPCInstr* PPCInstr_AddSubC ( Bool, Bool, HReg, HReg, HReg );
1091extern PPCInstr* PPCInstr_Cmp ( Bool, Bool, UInt, HReg, PPCRH* );
1092extern PPCInstr* PPCInstr_Unary ( PPCUnaryOp op, HReg dst, HReg src );
1093extern PPCInstr* PPCInstr_MulL ( Bool syned, Bool hi32, Bool sz32, HReg, HReg, HReg );
sewardj4aa412a2011-07-24 14:13:21 +00001094extern PPCInstr* PPCInstr_Div ( Bool extended, Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR );
sewardjcfe046e2013-01-17 14:23:53 +00001095extern PPCInstr* PPCInstr_Call ( PPCCondCode, Addr64, UInt, RetLoc );
sewardj3dee8492012-04-20 00:13:28 +00001096extern PPCInstr* PPCInstr_XDirect ( Addr64 dstGA, PPCAMode* amCIA,
1097 PPCCondCode cond, Bool toFastEP );
1098extern PPCInstr* PPCInstr_XIndir ( HReg dstGA, PPCAMode* amCIA,
1099 PPCCondCode cond );
1100extern PPCInstr* PPCInstr_XAssisted ( HReg dstGA, PPCAMode* amCIA,
1101 PPCCondCode cond, IRJumpKind jk );
cerion5b2325f2005-12-23 00:55:09 +00001102extern PPCInstr* PPCInstr_CMov ( PPCCondCode, HReg dst, PPCRI* src );
sewardj7fd5bb02006-01-26 02:24:17 +00001103extern PPCInstr* PPCInstr_Load ( UChar sz,
cerion5b2325f2005-12-23 00:55:09 +00001104 HReg dst, PPCAMode* src, Bool mode64 );
sewardje9d8a262009-07-01 08:06:34 +00001105extern PPCInstr* PPCInstr_LoadL ( UChar sz,
1106 HReg dst, HReg src, Bool mode64 );
cerion5b2325f2005-12-23 00:55:09 +00001107extern PPCInstr* PPCInstr_Store ( UChar sz, PPCAMode* dst,
1108 HReg src, Bool mode64 );
sewardje9d8a262009-07-01 08:06:34 +00001109extern PPCInstr* PPCInstr_StoreC ( UChar sz, HReg dst, HReg src,
1110 Bool mode64 );
cerion5b2325f2005-12-23 00:55:09 +00001111extern PPCInstr* PPCInstr_Set ( PPCCondCode cond, HReg dst );
1112extern PPCInstr* PPCInstr_MfCR ( HReg dst );
1113extern PPCInstr* PPCInstr_MFence ( void );
cerioned623db2005-06-20 12:42:04 +00001114
Elliott Hughesa0664b92017-04-18 17:46:52 -07001115extern PPCInstr* PPCInstr_Fp128Unary ( PPCFpOp op, HReg dst, HReg src );
1116extern PPCInstr* PPCInstr_Fp128Binary ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR );
1117extern PPCInstr* PPCInstr_Fp128Trinary ( PPCFpOp op, HReg dst, HReg srcL,
1118 HReg srcR);
1119
cerion5b2325f2005-12-23 00:55:09 +00001120extern PPCInstr* PPCInstr_FpUnary ( PPCFpOp op, HReg dst, HReg src );
1121extern PPCInstr* PPCInstr_FpBinary ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR );
sewardj40c80262006-02-08 19:30:46 +00001122extern PPCInstr* PPCInstr_FpMulAcc ( PPCFpOp op, HReg dst, HReg srcML,
1123 HReg srcMR, HReg srcAcc );
cerion5b2325f2005-12-23 00:55:09 +00001124extern PPCInstr* PPCInstr_FpLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* );
sewardj92923de2006-01-25 21:29:48 +00001125extern PPCInstr* PPCInstr_FpSTFIW ( HReg addr, HReg data );
1126extern PPCInstr* PPCInstr_FpRSP ( HReg dst, HReg src );
sewardj66d5ef22011-04-15 11:55:00 +00001127extern PPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned,
1128 Bool dst64, HReg dst, HReg src );
cerion5b2325f2005-12-23 00:55:09 +00001129extern PPCInstr* PPCInstr_FpCMov ( PPCCondCode, HReg dst, HReg src );
sewardjc6bbd472012-04-02 10:20:48 +00001130extern PPCInstr* PPCInstr_FpLdFPSCR ( HReg src, Bool dfp_rm );
cerion5b2325f2005-12-23 00:55:09 +00001131extern PPCInstr* PPCInstr_FpCmp ( HReg dst, HReg srcL, HReg srcR );
cerionbcf8c3e2005-02-04 16:17:07 +00001132
cerion5b2325f2005-12-23 00:55:09 +00001133extern PPCInstr* PPCInstr_RdWrLR ( Bool wrLR, HReg gpr );
cerion7f000af2005-02-22 20:36:49 +00001134
cerion5b2325f2005-12-23 00:55:09 +00001135extern PPCInstr* PPCInstr_AvLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* );
1136extern PPCInstr* PPCInstr_AvUnary ( PPCAvOp op, HReg dst, HReg src );
1137extern PPCInstr* PPCInstr_AvBinary ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
Elliott Hughesa0664b92017-04-18 17:46:52 -07001138extern PPCInstr* PPCInstr_AvBinaryInt( PPCAvOp op, HReg dst, HReg src, PPCRI* val );
cerion5b2325f2005-12-23 00:55:09 +00001139extern PPCInstr* PPCInstr_AvBin8x16 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1140extern PPCInstr* PPCInstr_AvBin16x8 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
1141extern PPCInstr* PPCInstr_AvBin32x4 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
carll0c74bb52013-08-12 18:01:40 +00001142extern PPCInstr* PPCInstr_AvBin64x2 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
sewardje522d4b2011-04-26 21:36:09 +00001143extern PPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, HReg srcL, HReg srcR );
1144extern PPCInstr* PPCInstr_AvUn32Fx4 ( PPCAvFpOp op, HReg dst, HReg src );
cerion5b2325f2005-12-23 00:55:09 +00001145extern PPCInstr* PPCInstr_AvPerm ( HReg dst, HReg srcL, HReg srcR, HReg ctl );
1146extern PPCInstr* PPCInstr_AvSel ( HReg ctl, HReg dst, HReg srcL, HReg srcR );
carll9877fe52014-10-07 17:49:14 +00001147extern PPCInstr* PPCInstr_AvSh ( Bool shLeft, HReg dst, PPCAMode* am_addr );
cerion5b2325f2005-12-23 00:55:09 +00001148extern PPCInstr* PPCInstr_AvShlDbl ( UChar shift, HReg dst, HReg srcL, HReg srcR );
1149extern PPCInstr* PPCInstr_AvSplat ( UChar sz, HReg dst, PPCVI5s* src );
1150extern PPCInstr* PPCInstr_AvCMov ( PPCCondCode, HReg dst, HReg src );
1151extern PPCInstr* PPCInstr_AvLdVSCR ( HReg src );
carll7deaf952013-10-15 18:11:20 +00001152extern PPCInstr* PPCInstr_AvCipherV128Unary ( PPCAvOp op, HReg dst,
1153 HReg srcR );
1154extern PPCInstr* PPCInstr_AvCipherV128Binary ( PPCAvOp op, HReg dst,
1155 HReg srcL, HReg srcR );
1156extern PPCInstr* PPCInstr_AvHashV128Binary ( PPCAvOp op, HReg dst,
1157 HReg src, PPCRI* s_field );
Elliott Hughesa0664b92017-04-18 17:46:52 -07001158extern PPCInstr* PPCInstr_AvBCDV128Binary ( PPCAvOp op, HReg dst,
1159 HReg src1, HReg src2 );
sewardjc6bbd472012-04-02 10:20:48 +00001160extern PPCInstr* PPCInstr_Dfp64Unary ( PPCFpOp op, HReg dst, HReg src );
1161extern PPCInstr* PPCInstr_Dfp64Binary ( PPCFpOp op, HReg dst, HReg srcL,
1162 HReg srcR );
sewardj26217b02012-04-12 17:19:48 +00001163extern PPCInstr* PPCInstr_DfpShift ( PPCFpOp op, HReg dst, HReg src,
sewardjcdc376d2012-04-23 11:21:12 +00001164 PPCRI* shift );
sewardj26217b02012-04-12 17:19:48 +00001165extern PPCInstr* PPCInstr_Dfp128Unary ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1166 HReg srcR_hi, HReg srcR_lo );
1167extern PPCInstr* PPCInstr_Dfp128Binary ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
1168 HReg srcR_hi, HReg srcR_lo );
1169extern PPCInstr* PPCInstr_DfpShift128 ( PPCFpOp op, HReg dst_hi, HReg src_hi,
1170 HReg dst_lo, HReg src_lo,
1171 PPCRI* shift );
1172extern PPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst,
1173 HReg dst_lo, HReg src_lo);
sewardjcdc376d2012-04-23 11:21:12 +00001174extern PPCInstr* PPCInstr_DfpI64StoD128 ( PPCFpOp op, HReg dst_hi,
1175 HReg dst_lo, HReg src);
1176extern PPCInstr* PPCInstr_DfpRound ( HReg dst, HReg src, PPCRI* r_rmc );
1177extern PPCInstr* PPCInstr_DfpRound128 ( HReg dst_hi, HReg dst_lo, HReg src_hi,
1178 HReg src_lo, PPCRI* r_rmc );
floriana7b0d102012-06-15 20:55:43 +00001179extern PPCInstr* PPCInstr_DfpQuantize ( PPCFpOp op, HReg dst, HReg srcL,
sewardjcdc376d2012-04-23 11:21:12 +00001180 HReg srcR, PPCRI* rmc );
floriana7b0d102012-06-15 20:55:43 +00001181extern PPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi,
sewardjcdc376d2012-04-23 11:21:12 +00001182 HReg dst_lo,
1183 HReg src_hi,
1184 HReg src_lo, PPCRI* rmc );
1185extern PPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op, HReg dst,
1186 HReg src_hi, HReg src_lo );
1187extern PPCInstr* PPCInstr_InsertExpD128 ( PPCFpOp op, HReg dst_hi,
1188 HReg dst_lo, HReg srcL,
1189 HReg srcR_hi, HReg srcR_lo );
1190extern PPCInstr* PPCInstr_Dfp64Cmp ( HReg dst, HReg srcL, HReg srcR );
1191extern PPCInstr* PPCInstr_Dfp128Cmp ( HReg dst, HReg srcL_hi, HReg srcL_lo,
1192 HReg srcR_hi, HReg srcR_lo );
sewardj3dee8492012-04-20 00:13:28 +00001193extern PPCInstr* PPCInstr_EvCheck ( PPCAMode* amCounter,
1194 PPCAMode* amFailAddr );
1195extern PPCInstr* PPCInstr_ProfInc ( void );
sewardjc6bbd472012-04-02 10:20:48 +00001196
floriand8c64e02014-10-08 08:54:44 +00001197extern void ppPPCInstr(const PPCInstr*, Bool mode64);
sewardjc6bbd472012-04-02 10:20:48 +00001198
cerionbcf8c3e2005-02-04 16:17:07 +00001199
1200/* Some functions that insulate the register allocator from details
1201 of the underlying instruction set. */
floriand8c64e02014-10-08 08:54:44 +00001202extern void getRegUsage_PPCInstr ( HRegUsage*, const PPCInstr*, Bool mode64 );
1203extern void mapRegs_PPCInstr ( HRegRemap*, PPCInstr* , Bool mode64);
1204extern Bool isMove_PPCInstr ( const PPCInstr*, HReg*, HReg* );
florian8462d112014-09-24 15:18:09 +00001205extern Int emit_PPCInstr ( /*MB_MOD*/Bool* is_profInc,
floriand8c64e02014-10-08 08:54:44 +00001206 UChar* buf, Int nbuf, const PPCInstr* i,
florian8462d112014-09-24 15:18:09 +00001207 Bool mode64,
1208 VexEndness endness_host,
1209 const void* disp_cp_chain_me_to_slowEP,
1210 const void* disp_cp_chain_me_to_fastEP,
1211 const void* disp_cp_xindir,
1212 const void* disp_cp_xassisted );
sewardj2a0cc852010-01-02 13:23:54 +00001213
1214extern void genSpill_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1215 HReg rreg, Int offsetB, Bool mode64 );
1216extern void genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
1217 HReg rreg, Int offsetB, Bool mode64 );
1218
sewardja5b50222015-03-26 07:18:32 +00001219extern const RRegUniverse* getRRegUniverse_PPC ( Bool mode64 );
1220
floriancacba8e2014-12-15 18:58:07 +00001221extern HInstrArray* iselSB_PPC ( const IRSB*,
sewardj3dee8492012-04-20 00:13:28 +00001222 VexArch,
floriand8c64e02014-10-08 08:54:44 +00001223 const VexArchInfo*,
1224 const VexAbiInfo*,
sewardj3dee8492012-04-20 00:13:28 +00001225 Int offs_Host_EvC_Counter,
1226 Int offs_Host_EvC_FailAddr,
1227 Bool chainingAllowed,
1228 Bool addProfInc,
floriandcd6d232015-01-02 17:32:21 +00001229 Addr max_ga );
sewardj3dee8492012-04-20 00:13:28 +00001230
1231/* How big is an event check? This is kind of a kludge because it
1232 depends on the offsets of host_EvC_FAILADDR and
1233 host_EvC_COUNTER. */
florian7ce2cc82015-01-10 16:10:58 +00001234extern Int evCheckSzB_PPC (void);
sewardj3dee8492012-04-20 00:13:28 +00001235
1236/* Perform a chaining and unchaining of an XDirect jump. */
sewardj9b769162014-07-24 12:42:03 +00001237extern VexInvalRange chainXDirect_PPC ( VexEndness endness_host,
1238 void* place_to_chain,
florian7d6f81d2014-09-22 21:43:37 +00001239 const void* disp_cp_chain_me_EXPECTED,
1240 const void* place_to_jump_to,
sewardj3dee8492012-04-20 00:13:28 +00001241 Bool mode64 );
1242
sewardj9b769162014-07-24 12:42:03 +00001243extern VexInvalRange unchainXDirect_PPC ( VexEndness endness_host,
1244 void* place_to_unchain,
florian7d6f81d2014-09-22 21:43:37 +00001245 const void* place_to_jump_to_EXPECTED,
1246 const void* disp_cp_chain_me,
sewardj3dee8492012-04-20 00:13:28 +00001247 Bool mode64 );
1248
1249/* Patch the counter location into an existing ProfInc point. */
sewardj9b769162014-07-24 12:42:03 +00001250extern VexInvalRange patchProfInc_PPC ( VexEndness endness_host,
1251 void* place_to_patch,
florian7d6f81d2014-09-22 21:43:37 +00001252 const ULong* location_of_counter,
sewardj3dee8492012-04-20 00:13:28 +00001253 Bool mode64 );
1254
cerionbcf8c3e2005-02-04 16:17:07 +00001255
sewardjcef7d3e2009-07-02 12:21:59 +00001256#endif /* ndef __VEX_HOST_PPC_DEFS_H */
cerionbcf8c3e2005-02-04 16:17:07 +00001257
1258/*---------------------------------------------------------------*/
sewardjcef7d3e2009-07-02 12:21:59 +00001259/*--- end host_ppc_defs.h ---*/
cerionbcf8c3e2005-02-04 16:17:07 +00001260/*---------------------------------------------------------------*/