1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin host_ppc_defs.h ---*/ 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This file is part of Valgrind, a dynamic binary instrumentation 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown framework. 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2004-2013 OpenWorks LLP 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown info@open-works.net 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU General Public License as 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown published by the Free Software Foundation; either version 2 of the 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, or (at your option) any later version. 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown General Public License for more details. 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU General Public License 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown along with this program; if not, write to the Free Software 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02110-1301, USA. 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The GNU General Public License is contained in the file COPYING. 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Neither the names of the U.S. Department of Energy nor the 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown University of California nor the names of its contributors may be 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown used to endorse or promote products derived from this software 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown without prior written permission. 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __VEX_HOST_PPC_DEFS_H 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __VEX_HOST_PPC_DEFS_H 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_basictypes.h" 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex.h" // VexArch 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "host_generic_regs.h" // HReg 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Num registers used for function calls */ 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PPC_N_REGPARMS 8 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Registers. --------- */ 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The usual HReg abstraction. There are 32 real int regs, 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32 real float regs, and 32 real vector regs. 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppHRegPPC ( HReg ); 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR0 ( Bool mode64 ); // scratch reg / zero reg 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR1 ( Bool mode64 ); // Stack Frame Pointer 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR2 ( Bool mode64 ); // not used: TOC pointer 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR3 ( Bool mode64 ); 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR4 ( Bool mode64 ); 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR5 ( Bool mode64 ); 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR6 ( Bool mode64 ); 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR7 ( Bool mode64 ); 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR8 ( Bool mode64 ); 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR9 ( Bool mode64 ); 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR10 ( Bool mode64 ); 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR11 ( Bool mode64 ); 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR12 ( Bool mode64 ); 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR13 ( Bool mode64 ); 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR14 ( Bool mode64 ); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR15 ( Bool mode64 ); 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR16 ( Bool mode64 ); 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR17 ( Bool mode64 ); 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR18 ( Bool mode64 ); 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR19 ( Bool mode64 ); 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR20 ( Bool mode64 ); 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR21 ( Bool mode64 ); 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR22 ( Bool mode64 ); 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR23 ( Bool mode64 ); 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR24 ( Bool mode64 ); 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR25 ( Bool mode64 ); 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR26 ( Bool mode64 ); 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR27 ( Bool mode64 ); 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR28 ( Bool mode64 ); 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR29 ( Bool mode64 ); // reserved for dispatcher 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR30 ( Bool mode64 ); // used as VMX spill temp 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR31 ( Bool mode64 ); // GuestStatePtr (callee-saved) 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR0 ( void ); 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR1 ( void ); 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR2 ( void ); 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR3 ( void ); 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR4 ( void ); 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR5 ( void ); 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR6 ( void ); 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR7 ( void ); 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR8 ( void ); 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR9 ( void ); 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR10 ( void ); 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR11 ( void ); 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR12 ( void ); 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR13 ( void ); 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR14 ( void ); 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR15 ( void ); 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR16 ( void ); 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR17 ( void ); 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR18 ( void ); 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR19 ( void ); 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR20 ( void ); 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR21 ( void ); 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR22 ( void ); 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR23 ( void ); 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR24 ( void ); 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR25 ( void ); 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR26 ( void ); 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR27 ( void ); 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR28 ( void ); 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR29 ( void ); 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR30 ( void ); 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR31 ( void ); 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR0 ( void ); 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR1 ( void ); 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR2 ( void ); 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR3 ( void ); 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR4 ( void ); 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR5 ( void ); 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR6 ( void ); 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR7 ( void ); 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR8 ( void ); 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR9 ( void ); 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR10 ( void ); 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR11 ( void ); 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR12 ( void ); 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR13 ( void ); 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR14 ( void ); 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR15 ( void ); 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR16 ( void ); 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR17 ( void ); 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR18 ( void ); 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR19 ( void ); 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR20 ( void ); 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR21 ( void ); 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR22 ( void ); 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR23 ( void ); 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR24 ( void ); 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR25 ( void ); 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR26 ( void ); 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR27 ( void ); 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR28 ( void ); 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR29 ( void ); 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR30 ( void ); 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR31 ( void ); 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define StackFramePtr(_mode64) hregPPC_GPR1(_mode64) 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GuestStatePtr(_mode64) hregPPC_GPR31(_mode64) 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Condition codes --------- */ 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This gives names from bitfields in CR; hence it names BI numbers */ 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Using IBM/hardware indexing convention */ 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // CR7, which we use for integer compares 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pcf_7LT = 28, /* neg | lt */ 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pcf_7GT = 29, /* pos | gt */ 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pcf_7EQ = 30, /* zero | equal */ 169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pcf_7SO = 31, /* summary overflow */ 170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pcf_NONE = 32 /* no condition; used with Pct_ALWAYS */ 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondFlag; 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { /* Maps bc bitfield BO */ 176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pct_FALSE = 0x4, /* associated PPCCondFlag must not be Pcf_NONE */ 177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pct_TRUE = 0xC, /* associated PPCCondFlag must not be Pcf_NONE */ 178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pct_ALWAYS = 0x14 /* associated PPCCondFlag must be Pcf_NONE */ 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondTest; 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondFlag flag; 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondTest test; 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode; 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCCondCode ( PPCCondCode ); 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* constructor */ 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCCondCode mk_PPCCondCode ( PPCCondTest, PPCCondFlag ); 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* false->true, true->false */ 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCCondTest invertCondTest ( PPCCondTest ); 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Memory address expressions (amodes). --------- */ 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pam_IR=1, /* Immediate (signed 16-bit) + Reg */ 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pam_RR=2 /* Reg1 + Reg2 */ 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAModeTag; 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAModeTag tag; 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg base; 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int index; 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } IR; 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg base; 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg index; 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } RR; 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Pam; 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode; 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* PPCAMode_IR ( Int, HReg ); 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* PPCAMode_RR ( HReg, HReg ); 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* dopyPPCAMode ( PPCAMode* ); 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCAMode ( PPCAMode* ); 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u16/s16. --------- */ 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ("RH" == "Register or Halfword immediate") */ 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Prh_Imm=3, 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Prh_Reg=4 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRHTag; 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRHTag tag; 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned; 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UShort imm16; 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Imm; 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg; 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Reg; 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Prh; 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH; 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRH* PPCRH_Imm ( Bool, UShort ); 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRH* PPCRH_Reg ( HReg ); 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCRH ( PPCRH* ); 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u32/64. --------- */ 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pri_Imm=5, 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pri_Reg=6 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRITag; 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRITag tag; 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong Imm; 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg Reg; 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pri; 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRI; 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRI* PPCRI_Imm ( ULong ); 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRI* PPCRI_Reg( HReg ); 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCRI ( PPCRI* ); 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a vector reg or a s6. --------- */ 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ("VI" == "Vector Register or Immediate") */ 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pvi_Imm=7, 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pvi_Reg=8 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5sTag; 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5sTag tag; 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char Imm5s; 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg Reg; 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pvi; 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5s; 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCVI5s* PPCVI5s_Imm ( Char ); 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCVI5s* PPCVI5s_Reg ( HReg ); 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCVI5s ( PPCVI5s* ); 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Instructions. --------- */ 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_NEG, 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_NOT, 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_CLZ32, 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_CLZ64, 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_EXTSW 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCUnaryOp; 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCUnaryOp ( PPCUnaryOp ); 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Palu_INVALID, 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Palu_ADD, Palu_SUB, 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Palu_AND, Palu_OR, Palu_XOR, 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAluOp; 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* showPPCAluOp ( PPCAluOp, 343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool /* is the 2nd operand an immediate? */); 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pshft_INVALID, 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pshft_SHL, Pshft_SHR, Pshft_SAR, 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCShftOp; 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* showPPCShftOp ( PPCShftOp, 356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool /* is the 2nd operand an immediate? */, 357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Bool /* is this a 32bit or 64bit op? */ ); 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pfp_INVALID, 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Ternary */ 366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_MADDD, Pfp_MSUBD, 367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_MADDS, Pfp_MSUBS, 368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DFPADD, Pfp_DFPADDQ, 369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DFPSUB, Pfp_DFPSUBQ, 370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DFPMUL, Pfp_DFPMULQ, 371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DFPDIV, Pfp_DFPDIVQ, 372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DQUAQ, Pfp_DRRNDQ, 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Binary */ 375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_ADDD, Pfp_SUBD, Pfp_MULD, Pfp_DIVD, 376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_ADDS, Pfp_SUBS, Pfp_MULS, Pfp_DIVS, 377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DRSP, Pfp_DRDPQ, Pfp_DCTFIX, Pfp_DCTFIXQ, Pfp_DCFFIX, 378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pfp_DQUA, Pfp_RRDTR, Pfp_DIEX, Pfp_DIEXQ, Pfp_DRINTN, 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Unary */ 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pfp_SQRT, Pfp_ABS, Pfp_NEG, Pfp_MOV, Pfp_RES, Pfp_RSQRTE, 382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_FRIN, Pfp_FRIM, Pfp_FRIP, Pfp_FRIZ, 383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DSCLI, Pfp_DSCRI, Pfp_DSCLIQ, Pfp_DSCRIQ, Pfp_DCTDP, 384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DCTQPQ, Pfp_DCFFIXQ, Pfp_DXEX, Pfp_DXEXQ, 385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCFpOp; 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCFpOp ( PPCFpOp ); 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_INVALID, 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Integer Unary */ 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_MOV, /* Mov */ 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_NOT, /* Bitwise */ 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_UNPCKH8S, Pav_UNPCKH16S, /* Unpack */ 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_UNPCKL8S, Pav_UNPCKL16S, 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_UNPCKHPIX, Pav_UNPCKLPIX, 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Integer Binary */ 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_AND, Pav_OR, Pav_XOR, /* Bitwise */ 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_ADDU, Pav_QADDU, Pav_QADDS, 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_SUBU, Pav_QSUBU, Pav_QSUBS, 408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pav_MULU, 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_OMULU, Pav_OMULS, Pav_EMULU, Pav_EMULS, 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_AVGU, Pav_AVGS, 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_MAXU, Pav_MAXS, 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_MINU, Pav_MINS, 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Compare (always affects CR field 6) */ 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_CMPEQU, Pav_CMPGTU, Pav_CMPGTS, 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Shift */ 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_SHL, Pav_SHR, Pav_SAR, Pav_ROTL, 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Pack */ 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_PACKUU, Pav_QPACKUU, Pav_QPACKSU, Pav_QPACKSS, 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_PACKPXL, 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Merge */ 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_MRGHI, Pav_MRGLO, 426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Concatenation */ 428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pav_CATODD, Pav_CATEVEN, 429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Polynomial Multipy-Add */ 431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pav_POLYMULADD, 432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Cipher */ 434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pav_CIPHERV128, Pav_CIPHERLV128, Pav_NCIPHERV128, Pav_NCIPHERLV128, 435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pav_CIPHERSUBV128, 436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Hash */ 438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pav_SHA256, Pav_SHA512, 439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* BCD Arithmetic */ 441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pav_BCDAdd, Pav_BCDSub, 442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* zero count */ 444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pav_ZEROCNTBYTE, Pav_ZEROCNTWORD, Pav_ZEROCNTHALF, Pav_ZEROCNTDBL, 445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Vector bit matrix transpose by byte */ 447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pav_BITMTXXPOSE, 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp; 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCAvOp ( PPCAvOp ); 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_INVALID, 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Floating point binary */ 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_ADDF, Pavfp_SUBF, Pavfp_MULF, 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_MAXF, Pavfp_MINF, 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_CMPEQF, Pavfp_CMPGTF, Pavfp_CMPGEF, 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Floating point unary */ 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_RCPF, Pavfp_RSQRTF, 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_CVTU2F, Pavfp_CVTS2F, Pavfp_QCVTF2U, Pavfp_QCVTF2S, 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_ROUNDM, Pavfp_ROUNDP, Pavfp_ROUNDN, Pavfp_ROUNDZ, 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvFpOp; 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern const HChar* showPPCAvFpOp ( PPCAvFpOp ); 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_LI, /* load word (32/64-bit) immediate (fake insn) */ 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Alu, /* word add/sub/and/or/xor */ 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Shft, /* word shl/shr/sar */ 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AddSubC, /* add/sub with read/write carry */ 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Cmp, /* word compare */ 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Unary, /* not, neg, clz */ 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_MulL, /* widening multiply */ 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Div, /* div */ 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Call, /* call to address in register */ 486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_XDirect, /* direct transfer to GA */ 487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_XIndir, /* indirect transfer to GA */ 488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_XAssisted, /* assisted transfer to GA */ 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_CMov, /* conditional move */ 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Load, /* zero-extending load a 8|16|32|64 bit value from mem */ 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_LoadL, /* load-linked (lwarx/ldarx) 32|64 bit value from mem */ 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Store, /* store a 8|16|32|64 bit value to mem */ 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_StoreC, /* store-conditional (stwcx./stdcx.) 32|64 bit val */ 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Set, /* convert condition code to value 0 or 1 */ 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_MfCR, /* move from condition register to GPR */ 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_MFence, /* mem fence */ 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpUnary, /* FP unary op */ 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpBinary, /* FP binary op */ 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpMulAcc, /* FP multipy-accumulate style op */ 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpLdSt, /* FP load/store */ 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpSTFIW, /* stfiwx */ 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpRSP, /* FP round IEEE754 double to IEEE754 single */ 504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pin_FpCftI, /* fcfid[u,s,us]/fctid[u]/fctiw[u] */ 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpCMov, /* FP floating point conditional move */ 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpLdFPSCR, /* mtfsf */ 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpCmp, /* FP compare, generating value into int reg */ 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_RdWrLR, /* Read/Write Link Register */ 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvLdSt, /* AV load/store (kludging for AMode_IR) */ 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvUnary, /* AV unary general reg=>reg */ 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBinary, /* AV binary general reg,reg=>reg */ 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBin8x16, /* AV binary, 8x4 */ 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBin16x8, /* AV binary, 16x4 */ 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBin32x4, /* AV binary, 32x4 */ 518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pin_AvBin64x2, /* AV binary, 64x2 */ 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBin32Fx4, /* AV FP binary, 32Fx4 */ 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvUn32Fx4, /* AV FP unary, 32Fx4 */ 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvPerm, /* AV permute (shuffle) */ 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvSel, /* AV select */ 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvShlDbl, /* AV shift-left double by imm */ 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvSplat, /* One elem repeated throughout dst */ 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvLdVSCR, /* mtvscr */ 528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_AvCMov, /* AV conditional move */ 529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pin_AvCipherV128Unary, /* AV Vector unary Cipher */ 530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pin_AvCipherV128Binary, /* AV Vector binary Cipher */ 531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pin_AvHashV128Binary, /* AV Vector binary Hash */ 532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Pin_AvBCDV128Trinary, /* BCD Arithmetic */ 533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp64Unary, /* DFP64 unary op */ 534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp128Unary, /* DFP128 unary op */ 535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpShift, /* Decimal floating point shift by immediate value */ 536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp64Binary, /* DFP64 binary op */ 537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp128Binary, /* DFP128 binary op */ 538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpShift128, /* 128-bit Decimal floating point shift by 539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * immediate value */ 540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpD128toD64, /* DFP 128 to DFP 64 op */ 541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpI64StoD128, /* DFP signed integer to DFP 128 */ 542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpRound, /* D64 round to D64 */ 543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpRound128, /* D128 round to D128 */ 544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_ExtractExpD128, /* DFP, extract 64 bit exponent */ 545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_InsertExpD128, /* DFP, insert 64 bit exponent and 128 bit binary 546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * significand into a DFP 128-bit value*/ 547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp64Cmp, /* DFP 64-bit compare, generating value into 548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * int reg */ 549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp128Cmp, /* DFP 128-bit compare, generating value into 550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * int reg */ 551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpQuantize, /* D64 quantize using register value, significance 552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * round */ 553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpQuantize128, /* D128 quantize using register value, significance 554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * round */ 555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_EvCheck, /* Event check */ 556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_ProfInc /* 64-bit profile counter increment */ 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstrTag; 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Destinations are on the LEFT (first operand) */ 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstrTag tag; 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Get a 32/64-bit literal into a register. 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown May turn into a number of real insns. */ 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong imm64; 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } LI; 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Integer add/sub/and/or/xor. Limitations: 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown - For add, the immediate, if it exists, is a signed 16. 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown - For sub, the immediate, if it exists, is a signed 16 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown which may not be -32768, since no such instruction 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exists, and so we have to emit addi with +32768, but 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown that is not possible. 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown - For and/or/xor, the immediate, if it exists, 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is an unsigned 16. 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAluOp op; 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR; 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Alu; 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Integer shl/shr/sar. 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Limitations: the immediate, if it exists, 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is a signed 5-bit value between 1 and 31 inclusive. 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCShftOp op; 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32; /* mode64 has both 32 and 64bit shft */ 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR; 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Shft; 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* */ 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool isAdd; /* else sub */ 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool setC; /* else read carry */ 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AddSubC; 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* If signed, the immediate, if it exists, is a signed 16, 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else it is an unsigned 16. */ 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned; 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32; /* mode64 has both 32 and 64bit cmp */ 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt crfD; 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR; 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Cmp; 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Not, Neg, Clz32/64, Extsw */ 616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCUnaryOp op; 618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Unary; 621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned; /* meaningless if hi32==False */ 623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool hi; /* False=>low, True=>high */ 624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32; /* mode64 has both 32 & 64bit mull */ 625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } MulL; 629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* ppc32 div/divu instruction. */ 630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool extended; 632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned; 633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32; /* mode64 has both 32 & 64bit div */ 634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Div; 638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Pseudo-insn. Call target (an absolute address), on given 639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown condition (which could be Pct_ALWAYS). argiregs indicates 640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown which of r3 .. r10 carries argument values for this call, 641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown using a bit mask (1<<N is set if rN holds an arg, for N in 642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3 .. 10 inclusive). */ 643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr64 target; 646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt argiregs; 647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov RetLoc rloc; /* where the return value will be */ 648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Call; 649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest CIA value, then exit requesting to chain 650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng to it. May be conditional. Use of Addr64 in order to cope 651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng with 64-bit hosts. */ 652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Addr64 dstGA; /* next guest address */ 654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amCIA; /* amode in guest state for CIA */ 655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond; /* can be ALWAYS */ 656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool toFastEP; /* chain to the slow or fast point? */ 657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } XDirect; 658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Boring transfer to a guest address not known at JIT time. 659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Not chainable. May be conditional. */ 660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dstGA; 662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amCIA; 663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond; /* can be ALWAYS */ 664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } XIndir; 665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Assisted transfer to a guest address, most general case. 666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Not chainable. May be conditional. */ 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dstGA; 669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amCIA; 670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond; /* can be ALWAYS */ 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IRJumpKind jk; 672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } XAssisted; 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Mov src to dst on the given condition, which may not 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown be the bogus Pct_ALWAYS. */ 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRI* src; 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } CMov; 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Zero extending loads. Dst size is host word size */ 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 1|2|4|8 */ 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* src; 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Load; 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Load-and-reserve (lwarx, ldarx) */ 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 4|8 */ 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } LoadL; 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* 64/32/16/8 bit stores */ 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 1|2|4|8 */ 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* dst; 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Store; 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Store-conditional (stwcx., stdcx.) */ 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 4|8 */ 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } StoreC; 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Convert a ppc condition code to value 0 or 1. */ 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Set; 709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Move the entire CR to a GPR */ 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } MfCR; 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Mem fence. In short, an insn which flushes all preceding 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown loads and stores as much as possible before continuing. 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown On PPC we emit a "sync". */ 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } MFence; 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC Floating point */ 720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCFpOp op; 722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpUnary; 725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCFpOp op; 727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpBinary; 731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCFpOp op; 733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcML; 735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcMR; 736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcAcc; 737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpMulAcc; 738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool isLoad; 740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* only 4 (IEEE single) or 8 (IEEE double) */ 741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg; 742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* addr; 743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpLdSt; 744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg addr; /* int reg */ 746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg data; /* float reg */ 747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpSTFIW; 748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Round 64-bit FP value to 32-bit FP value in an FP reg. */ 749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpRSP; 753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* fcfid[u,s,us]/fctid[u]/fctiw[u]. Only some combinations 754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov of the various fields are allowed. This is asserted for 755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov and documented in the code for the constructor, 756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PPCInstr_FpCftI, in host_ppc_defs.c. */ 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool fromI; /* True== I->F, False== F->I */ 759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool int32; /* True== I is 32, False== I is 64 */ 760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool syned; 761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool flt64; /* True== F is 64, False== F is 32 */ 762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpCftI; 765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* FP mov src to dst on the given condition. */ 766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpCMov; 771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Load FP Status & Control Register */ 772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt dfp_rm; 775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpLdFPSCR; 776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Do a compare, generating result into an int register. */ 777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar crfD; 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpCmp; 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Read/Write Link Register */ 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool wrLR; 787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg gpr; 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } RdWrLR; 789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Simplistic AltiVec */ 791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool isLoad; 793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 8|16|32|128 */ 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg; 795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* addr; 796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvLdSt; 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvUnary; 802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBinary; 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBin8x16; 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBin16x8; 820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBin32x4; 826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Can only be generated for CPUs capable of ISA 2.07 or above */ 827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov struct { 828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCAvOp op; 829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg dst; 830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg srcL; 831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg srcR; 832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } AvBin64x2; 833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvFpOp op; 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBin32Fx4; 839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvFpOp op; 841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvUn32Fx4; 844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Perm,Sel,SlDbl,Splat are all weird AV permutations */ 845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg ctl; 850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvPerm; 851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg ctl; 856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvSel; 857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar shift; 859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvShlDbl; 863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 8,16,32 */ 865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5s* src; 867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvSplat; 868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Mov src to dst on the given condition, which may not 869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown be the bogus Xcc_ALWAYS. */ 870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvCMov; 875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Load AltiVec Status & Control Register */ 876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvLdVSCR; 879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCAvOp op; 881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg dst; 882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src; 883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } AvCipherV128Unary; 884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov struct { 885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCAvOp op; 886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg dst; 887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src; 888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCRI* s_field; 889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } AvHashV128Binary; 890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov struct { 891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCAvOp op; 892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg dst; 893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src1; 894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src2; 895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCRI* ps; 896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } AvBCDV128Trinary; 897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov struct { 898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCAvOp op; 899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg dst; 900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg srcL; 901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg srcR; 902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } AvCipherV128Binary; 903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov struct { 904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src; 907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp64Unary; 908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL; 912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR; 913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp64Binary; 914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src; 918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift; 919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpShift; 920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp128Unary; 927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The dst is used to pass the left source operand in and return 929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * the result. 930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi; 935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_lo; 936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp128Binary; 937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift; 944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpShift128; 945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src; 948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* r_rmc; 949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpRound; 950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* r_rmc; 956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpRound128; 957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL; 961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR; 962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* rmc; 963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpQuantize; 964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* rmc; 971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpQuantize128; 972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } ExtractExpD128; 978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL; 983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi; 984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_lo; 985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } InsertExpD128; 986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpD128toD64; 992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src; 997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpI64StoD128; 998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar crfD; 1000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 1001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL; 1002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR; 1003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp64Cmp; 1004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 1005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar crfD; 1006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 1007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL_hi; 1008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL_lo; 1009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi; 1010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_lo; 1011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp128Cmp; 1012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 1013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amCounter; 1014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amFailAddr; 1015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } EvCheck; 1016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 1017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* No fields. The address of the counter to inc is 1018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng installed later, post-translation, by patching it in, 1019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng as it is not known at translation time. */ 1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } ProfInc; 1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Pin; 1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr; 1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_LI ( HReg, ULong, Bool ); 1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Alu ( PPCAluOp, HReg, HReg, PPCRH* ); 1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Shft ( PPCShftOp, Bool sz32, HReg, HReg, PPCRH* ); 1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AddSubC ( Bool, Bool, HReg, HReg, HReg ); 1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Cmp ( Bool, Bool, UInt, HReg, PPCRH* ); 1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Unary ( PPCUnaryOp op, HReg dst, HReg src ); 1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MulL ( Bool syned, Bool hi32, Bool sz32, HReg, HReg, HReg ); 1033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_Div ( Bool extended, Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR ); 1034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_Call ( PPCCondCode, Addr64, UInt, RetLoc ); 1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XDirect ( Addr64 dstGA, PPCAMode* amCIA, 1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond, Bool toFastEP ); 1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XIndir ( HReg dstGA, PPCAMode* amCIA, 1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond ); 1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XAssisted ( HReg dstGA, PPCAMode* amCIA, 1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond, IRJumpKind jk ); 1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_CMov ( PPCCondCode, HReg dst, PPCRI* src ); 1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Load ( UChar sz, 1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, PPCAMode* src, Bool mode64 ); 1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_LoadL ( UChar sz, 1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg src, Bool mode64 ); 1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Store ( UChar sz, PPCAMode* dst, 1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src, Bool mode64 ); 1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_StoreC ( UChar sz, HReg dst, HReg src, 1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool mode64 ); 1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Set ( PPCCondCode cond, HReg dst ); 1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MfCR ( HReg dst ); 1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MFence ( void ); 1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpUnary ( PPCFpOp op, HReg dst, HReg src ); 1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpBinary ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR ); 1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpMulAcc ( PPCFpOp op, HReg dst, HReg srcML, 1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcMR, HReg srcAcc ); 1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* ); 1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpSTFIW ( HReg addr, HReg data ); 1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpRSP ( HReg dst, HReg src ); 1061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned, 1062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool dst64, HReg dst, HReg src ); 1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpCMov ( PPCCondCode, HReg dst, HReg src ); 1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_FpLdFPSCR ( HReg src, Bool dfp_rm ); 1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpCmp ( HReg dst, HReg srcL, HReg srcR ); 1066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_RdWrLR ( Bool wrLR, HReg gpr ); 1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* ); 1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvUnary ( PPCAvOp op, HReg dst, HReg src ); 1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBinary ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR ); 1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin8x16 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR ); 1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin16x8 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR ); 1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin32x4 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR ); 1075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvBin64x2 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR ); 1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, HReg srcL, HReg srcR ); 1077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_AvUn32Fx4 ( PPCAvFpOp op, HReg dst, HReg src ); 1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvPerm ( HReg dst, HReg srcL, HReg srcR, HReg ctl ); 1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvSel ( HReg ctl, HReg dst, HReg srcL, HReg srcR ); 1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvShlDbl ( UChar shift, HReg dst, HReg srcL, HReg srcR ); 1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvSplat ( UChar sz, HReg dst, PPCVI5s* src ); 1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvCMov ( PPCCondCode, HReg dst, HReg src ); 1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvLdVSCR ( HReg src ); 1084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvCipherV128Unary ( PPCAvOp op, HReg dst, 1085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg srcR ); 1086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvCipherV128Binary ( PPCAvOp op, HReg dst, 1087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg srcL, HReg srcR ); 1088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvHashV128Binary ( PPCAvOp op, HReg dst, 1089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src, PPCRI* s_field ); 1090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern PPCInstr* PPCInstr_AvBCDV128Trinary ( PPCAvOp op, HReg dst, 1091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src1, HReg src2, 1092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCRI* ps ); 1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Unary ( PPCFpOp op, HReg dst, HReg src ); 1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Binary ( PPCFpOp op, HReg dst, HReg srcL, 1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR ); 1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpShift ( PPCFpOp op, HReg dst, HReg src, 1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift ); 1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Unary ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ); 1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Binary ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ); 1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpShift128 ( PPCFpOp op, HReg dst_hi, HReg src_hi, 1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg src_lo, 1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift ); 1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst, 1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg src_lo); 1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpI64StoD128 ( PPCFpOp op, HReg dst_hi, 1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg src); 1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpRound ( HReg dst, HReg src, PPCRI* r_rmc ); 1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpRound128 ( HReg dst_hi, HReg dst_lo, HReg src_hi, 1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo, PPCRI* r_rmc ); 1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpQuantize ( PPCFpOp op, HReg dst, HReg srcL, 1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR, PPCRI* rmc ); 1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi, 1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, 1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, 1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo, PPCRI* rmc ); 1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op, HReg dst, 1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo ); 1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_InsertExpD128 ( PPCFpOp op, HReg dst_hi, 1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg srcL, 1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ); 1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Cmp ( HReg dst, HReg srcL, HReg srcR ); 1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Cmp ( HReg dst, HReg srcL_hi, HReg srcL_lo, 1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ); 1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_EvCheck ( PPCAMode* amCounter, 1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amFailAddr ); 1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_ProfInc ( void ); 1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void ppPPCInstr(PPCInstr*, Bool mode64); 1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Some functions that insulate the register allocator from details 1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown of the underlying instruction set. */ 1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void getRegUsage_PPCInstr ( HRegUsage*, PPCInstr*, Bool mode64 ); 1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void mapRegs_PPCInstr ( HRegRemap*, PPCInstr* , Bool mode64); 1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool isMove_PPCInstr ( PPCInstr*, HReg*, HReg* ); 1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int emit_PPCInstr ( /*MB_MOD*/Bool* is_profInc, 1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* buf, Int nbuf, PPCInstr* i, 1140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool mode64, 1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_slowEP, 1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_fastEP, 1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xindir, 1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xassisted ); 1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genSpill_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg rreg, Int offsetB, Bool mode64 ); 1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg rreg, Int offsetB, Bool mode64 ); 1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void getAllocableRegs_PPC ( Int*, HReg**, Bool mode64 ); 1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern HInstrArray* iselSB_PPC ( IRSB*, 1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexArch, 1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexArchInfo*, 1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexAbiInfo*, 1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int offs_Host_EvC_Counter, 1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int offs_Host_EvC_FailAddr, 1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool chainingAllowed, 1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool addProfInc, 1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Addr64 max_ga ); 1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check? This is kind of a kludge because it 1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng depends on the offsets of host_EvC_FAILADDR and 1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng host_EvC_COUNTER. */ 1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int evCheckSzB_PPC ( void ); 1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Perform a chaining and unchaining of an XDirect jump. */ 1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange chainXDirect_PPC ( void* place_to_chain, 1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_EXPECTED, 1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to, 1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ); 1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange unchainXDirect_PPC ( void* place_to_unchain, 1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to_EXPECTED, 1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me, 1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ); 1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter location into an existing ProfInc point. */ 1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange patchProfInc_PPC ( void* place_to_patch, 1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ULong* location_of_counter, 1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ); 1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __VEX_HOST_PPC_DEFS_H */ 1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end host_ppc_defs.h ---*/ 1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 1189