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 10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Copyright (C) 2004-2012 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 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Num registers used for function calls */ 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define PPC_N_REGPARMS 8 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Registers. --------- */ 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The usual HReg abstraction. There are 32 real int regs, 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32 real float regs, and 32 real vector regs. 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppHRegPPC ( HReg ); 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR0 ( Bool mode64 ); // scratch reg / zero reg 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR1 ( Bool mode64 ); // Stack Frame Pointer 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR2 ( Bool mode64 ); // not used: TOC pointer 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR3 ( Bool mode64 ); 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR4 ( Bool mode64 ); 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR5 ( Bool mode64 ); 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR6 ( Bool mode64 ); 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR7 ( Bool mode64 ); 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR8 ( Bool mode64 ); 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR9 ( Bool mode64 ); 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR10 ( Bool mode64 ); 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR11 ( Bool mode64 ); 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR12 ( Bool mode64 ); 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR13 ( Bool mode64 ); 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR14 ( Bool mode64 ); 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR15 ( Bool mode64 ); 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR16 ( Bool mode64 ); 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR17 ( Bool mode64 ); 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR18 ( Bool mode64 ); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR19 ( Bool mode64 ); 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR20 ( Bool mode64 ); 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR21 ( Bool mode64 ); 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR22 ( Bool mode64 ); 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR23 ( Bool mode64 ); 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR24 ( Bool mode64 ); 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR25 ( Bool mode64 ); 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR26 ( Bool mode64 ); 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR27 ( Bool mode64 ); 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR28 ( Bool mode64 ); 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR29 ( Bool mode64 ); // reserved for dispatcher 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR30 ( Bool mode64 ); // used as VMX spill temp 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_GPR31 ( Bool mode64 ); // GuestStatePtr (callee-saved) 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR0 ( void ); 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR1 ( void ); 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR2 ( void ); 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR3 ( void ); 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR4 ( void ); 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR5 ( void ); 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR6 ( void ); 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR7 ( void ); 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR8 ( void ); 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR9 ( void ); 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR10 ( void ); 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR11 ( void ); 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR12 ( void ); 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR13 ( void ); 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR14 ( void ); 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR15 ( void ); 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR16 ( void ); 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR17 ( void ); 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR18 ( void ); 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR19 ( void ); 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR20 ( void ); 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR21 ( void ); 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR22 ( void ); 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR23 ( void ); 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR24 ( void ); 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR25 ( void ); 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR26 ( void ); 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR27 ( void ); 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR28 ( void ); 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR29 ( void ); 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR30 ( void ); 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_FPR31 ( void ); 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR0 ( void ); 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR1 ( void ); 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR2 ( void ); 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR3 ( void ); 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR4 ( void ); 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR5 ( void ); 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR6 ( void ); 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR7 ( void ); 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR8 ( void ); 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR9 ( void ); 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR10 ( void ); 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR11 ( void ); 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR12 ( void ); 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR13 ( void ); 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR14 ( void ); 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR15 ( void ); 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR16 ( void ); 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR17 ( void ); 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR18 ( void ); 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR19 ( void ); 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR20 ( void ); 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR21 ( void ); 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR22 ( void ); 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR23 ( void ); 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR24 ( void ); 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR25 ( void ); 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR26 ( void ); 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR27 ( void ); 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR28 ( void ); 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR29 ( void ); 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR30 ( void ); 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HReg hregPPC_VR31 ( void ); 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define StackFramePtr(_mode64) hregPPC_GPR1(_mode64) 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GuestStatePtr(_mode64) hregPPC_GPR31(_mode64) 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Condition codes --------- */ 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This gives names from bitfields in CR; hence it names BI numbers */ 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Using IBM/hardware indexing convention */ 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // CR7, which we use for integer compares 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pcf_7LT = 28, /* neg | lt */ 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pcf_7GT = 29, /* pos | gt */ 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pcf_7EQ = 30, /* zero | equal */ 165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pcf_7SO = 31, /* summary overflow */ 166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pcf_NONE = 32 /* no condition; used with Pct_ALWAYS */ 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondFlag; 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { /* Maps bc bitfield BO */ 172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pct_FALSE = 0x4, /* associated PPCCondFlag must not be Pcf_NONE */ 173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pct_TRUE = 0xC, /* associated PPCCondFlag must not be Pcf_NONE */ 174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pct_ALWAYS = 0x14 /* associated PPCCondFlag must be Pcf_NONE */ 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondTest; 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondFlag flag; 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondTest test; 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode; 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCCondCode ( PPCCondCode ); 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* constructor */ 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCCondCode mk_PPCCondCode ( PPCCondTest, PPCCondFlag ); 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* false->true, true->false */ 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCCondTest invertCondTest ( PPCCondTest ); 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Memory address expressions (amodes). --------- */ 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pam_IR=1, /* Immediate (signed 16-bit) + Reg */ 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pam_RR=2 /* Reg1 + Reg2 */ 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAModeTag; 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAModeTag tag; 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg base; 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int index; 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } IR; 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg base; 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg index; 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } RR; 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Pam; 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode; 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* PPCAMode_IR ( Int, HReg ); 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* PPCAMode_RR ( HReg, HReg ); 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCAMode* dopyPPCAMode ( PPCAMode* ); 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCAMode ( PPCAMode* ); 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u16/s16. --------- */ 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ("RH" == "Register or Halfword immediate") */ 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Prh_Imm=3, 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Prh_Reg=4 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRHTag; 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRHTag tag; 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned; 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UShort imm16; 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Imm; 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg; 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Reg; 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Prh; 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH; 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRH* PPCRH_Imm ( Bool, UShort ); 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRH* PPCRH_Reg ( HReg ); 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCRH ( PPCRH* ); 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u32/64. --------- */ 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pri_Imm=5, 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pri_Reg=6 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRITag; 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRITag tag; 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong Imm; 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg Reg; 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pri; 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRI; 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRI* PPCRI_Imm ( ULong ); 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCRI* PPCRI_Reg( HReg ); 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCRI ( PPCRI* ); 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a vector reg or a s6. --------- */ 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ("VI" == "Vector Register or Immediate") */ 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pvi_Imm=7, 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pvi_Reg=8 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5sTag; 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5sTag tag; 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char Imm5s; 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg Reg; 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pvi; 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5s; 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCVI5s* PPCVI5s_Imm ( Char ); 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCVI5s* PPCVI5s_Reg ( HReg ); 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void ppPPCVI5s ( PPCVI5s* ); 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Instructions. --------- */ 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_NEG, 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_NOT, 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_CLZ32, 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_CLZ64, 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pun_EXTSW 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCUnaryOp; 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCUnaryOp ( PPCUnaryOp ); 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Palu_INVALID, 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Palu_ADD, Palu_SUB, 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Palu_AND, Palu_OR, Palu_XOR, 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAluOp; 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCAluOp ( PPCAluOp, 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool /* is the 2nd operand an immediate? */); 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pshft_INVALID, 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pshft_SHL, Pshft_SHR, Pshft_SAR, 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCShftOp; 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCShftOp ( PPCShftOp, 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool /* is the 2nd operand an immediate? */, 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool /* is this a 32bit or 64bit op? */ ); 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pfp_INVALID, 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Ternary */ 362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_MADDD, Pfp_MSUBD, 363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_MADDS, Pfp_MSUBS, 364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DFPADD, Pfp_DFPADDQ, 365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DFPSUB, Pfp_DFPSUBQ, 366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DFPMUL, Pfp_DFPMULQ, 367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DFPDIV, Pfp_DFPDIVQ, 368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DQUAQ, Pfp_DRRNDQ, 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Binary */ 371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_ADDD, Pfp_SUBD, Pfp_MULD, Pfp_DIVD, 372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_ADDS, Pfp_SUBS, Pfp_MULS, Pfp_DIVS, 373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DRSP, Pfp_DRDPQ, Pfp_DCTFIX, Pfp_DCTFIXQ, Pfp_DCFFIX, 374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DQUA, Pfp_RRDTR, Pfp_DIEX, Pfp_DIEXQ, 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Unary */ 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pfp_SQRT, Pfp_ABS, Pfp_NEG, Pfp_MOV, Pfp_RES, Pfp_RSQRTE, 378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_FRIN, Pfp_FRIM, Pfp_FRIP, Pfp_FRIZ, 379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DSCLI, Pfp_DSCRI, Pfp_DSCLIQ, Pfp_DSCRIQ, Pfp_DCTDP, 380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pfp_DCTQPQ, Pfp_DCFFIXQ, Pfp_DXEX, Pfp_DXEXQ, 381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCFpOp; 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCFpOp ( PPCFpOp ); 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_INVALID, 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Integer Unary */ 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_MOV, /* Mov */ 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_NOT, /* Bitwise */ 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_UNPCKH8S, Pav_UNPCKH16S, /* Unpack */ 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_UNPCKL8S, Pav_UNPCKL16S, 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_UNPCKHPIX, Pav_UNPCKLPIX, 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Integer Binary */ 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_AND, Pav_OR, Pav_XOR, /* Bitwise */ 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_ADDU, Pav_QADDU, Pav_QADDS, 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_SUBU, Pav_QSUBU, Pav_QSUBS, 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_OMULU, Pav_OMULS, Pav_EMULU, Pav_EMULS, 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_AVGU, Pav_AVGS, 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_MAXU, Pav_MAXS, 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_MINU, Pav_MINS, 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Compare (always affects CR field 6) */ 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_CMPEQU, Pav_CMPGTU, Pav_CMPGTS, 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Shift */ 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_SHL, Pav_SHR, Pav_SAR, Pav_ROTL, 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Pack */ 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_PACKUU, Pav_QPACKUU, Pav_QPACKSU, Pav_QPACKSS, 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_PACKPXL, 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Merge */ 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pav_MRGHI, Pav_MRGLO, 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp; 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCAvOp ( PPCAvOp ); 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_INVALID, 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Floating point binary */ 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_ADDF, Pavfp_SUBF, Pavfp_MULF, 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_MAXF, Pavfp_MINF, 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_CMPEQF, Pavfp_CMPGTF, Pavfp_CMPGEF, 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Floating point unary */ 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_RCPF, Pavfp_RSQRTF, 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_CVTU2F, Pavfp_CVTS2F, Pavfp_QCVTF2U, Pavfp_QCVTF2S, 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pavfp_ROUNDM, Pavfp_ROUNDP, Pavfp_ROUNDN, Pavfp_ROUNDZ, 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvFpOp; 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* showPPCAvFpOp ( PPCAvFpOp ); 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- */ 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_LI, /* load word (32/64-bit) immediate (fake insn) */ 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Alu, /* word add/sub/and/or/xor */ 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Shft, /* word shl/shr/sar */ 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AddSubC, /* add/sub with read/write carry */ 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Cmp, /* word compare */ 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Unary, /* not, neg, clz */ 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_MulL, /* widening multiply */ 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Div, /* div */ 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Call, /* call to address in register */ 459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_XDirect, /* direct transfer to GA */ 460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_XIndir, /* indirect transfer to GA */ 461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_XAssisted, /* assisted transfer to GA */ 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_CMov, /* conditional move */ 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Load, /* zero-extending load a 8|16|32|64 bit value from mem */ 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_LoadL, /* load-linked (lwarx/ldarx) 32|64 bit value from mem */ 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Store, /* store a 8|16|32|64 bit value to mem */ 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_StoreC, /* store-conditional (stwcx./stdcx.) 32|64 bit val */ 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_Set, /* convert condition code to value 0 or 1 */ 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_MfCR, /* move from condition register to GPR */ 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_MFence, /* mem fence */ 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpUnary, /* FP unary op */ 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpBinary, /* FP binary op */ 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpMulAcc, /* FP multipy-accumulate style op */ 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpLdSt, /* FP load/store */ 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpSTFIW, /* stfiwx */ 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpRSP, /* FP round IEEE754 double to IEEE754 single */ 477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Pin_FpCftI, /* fcfid[u,s,us]/fctid[u]/fctiw[u] */ 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpCMov, /* FP floating point conditional move */ 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpLdFPSCR, /* mtfsf */ 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_FpCmp, /* FP compare, generating value into int reg */ 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_RdWrLR, /* Read/Write Link Register */ 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvLdSt, /* AV load/store (kludging for AMode_IR) */ 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvUnary, /* AV unary general reg=>reg */ 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBinary, /* AV binary general reg,reg=>reg */ 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBin8x16, /* AV binary, 8x4 */ 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBin16x8, /* AV binary, 16x4 */ 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBin32x4, /* AV binary, 32x4 */ 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvBin32Fx4, /* AV FP binary, 32Fx4 */ 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvUn32Fx4, /* AV FP unary, 32Fx4 */ 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvPerm, /* AV permute (shuffle) */ 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvSel, /* AV select */ 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvShlDbl, /* AV shift-left double by imm */ 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvSplat, /* One elem repeated throughout dst */ 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Pin_AvLdVSCR, /* mtvscr */ 500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_AvCMov, /* AV conditional move */ 501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp64Unary, /* DFP64 unary op */ 502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp128Unary, /* DFP128 unary op */ 503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpShift, /* Decimal floating point shift by immediate value */ 504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp64Binary, /* DFP64 binary op */ 505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp128Binary, /* DFP128 binary op */ 506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpShift128, /* 128-bit Decimal floating point shift by 507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * immediate value */ 508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpD128toD64, /* DFP 128 to DFP 64 op */ 509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpI64StoD128, /* DFP signed integer to DFP 128 */ 510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpRound, /* D64 round to D64 */ 511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpRound128, /* D128 round to D128 */ 512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_ExtractExpD128, /* DFP, extract 64 bit exponent */ 513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_InsertExpD128, /* DFP, insert 64 bit exponent and 128 bit binary 514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * significand into a DFP 128-bit value*/ 515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp64Cmp, /* DFP 64-bit compare, generating value into 516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * int reg */ 517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_Dfp128Cmp, /* DFP 128-bit compare, generating value into 518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * int reg */ 519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpQuantize, /* D64 quantize using register value, significance 520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * round */ 521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_DfpQuantize128, /* D128 quantize using register value, significance 522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * round */ 523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_EvCheck, /* Event check */ 524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Pin_ProfInc /* 64-bit profile counter increment */ 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstrTag; 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Destinations are on the LEFT (first operand) */ 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstrTag tag; 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union { 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Get a 32/64-bit literal into a register. 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown May turn into a number of real insns. */ 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong imm64; 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } LI; 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Integer add/sub/and/or/xor. Limitations: 541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown - For add, the immediate, if it exists, is a signed 16. 542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown - For sub, the immediate, if it exists, is a signed 16 543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown which may not be -32768, since no such instruction 544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exists, and so we have to emit addi with +32768, but 545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown that is not possible. 546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown - For and/or/xor, the immediate, if it exists, 547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is an unsigned 16. 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAluOp op; 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR; 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Alu; 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Integer shl/shr/sar. 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Limitations: the immediate, if it exists, 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is a signed 5-bit value between 1 and 31 inclusive. 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCShftOp op; 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32; /* mode64 has both 32 and 64bit shft */ 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR; 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Shft; 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* */ 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool isAdd; /* else sub */ 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool setC; /* else read carry */ 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AddSubC; 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* If signed, the immediate, if it exists, is a signed 16, 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else it is an unsigned 16. */ 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned; 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32; /* mode64 has both 32 and 64bit cmp */ 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt crfD; 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR; 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Cmp; 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Not, Neg, Clz32/64, Extsw */ 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCUnaryOp op; 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Unary; 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned; /* meaningless if hi32==False */ 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool hi; /* False=>low, True=>high */ 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32; /* mode64 has both 32 & 64bit mull */ 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } MulL; 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* ppc32 div/divu instruction. */ 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool extended; 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned; 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32; /* mode64 has both 32 & 64bit div */ 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Div; 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Pseudo-insn. Call target (an absolute address), on given 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown condition (which could be Pct_ALWAYS). argiregs indicates 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown which of r3 .. r10 carries argument values for this call, 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown using a bit mask (1<<N is set if rN holds an arg, for N in 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3 .. 10 inclusive). */ 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr64 target; 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt argiregs; 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Call; 616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest CIA value, then exit requesting to chain 617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng to it. May be conditional. Use of Addr64 in order to cope 618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng with 64-bit hosts. */ 619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Addr64 dstGA; /* next guest address */ 621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amCIA; /* amode in guest state for CIA */ 622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond; /* can be ALWAYS */ 623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool toFastEP; /* chain to the slow or fast point? */ 624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } XDirect; 625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Boring transfer to a guest address not known at JIT time. 626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Not chainable. May be conditional. */ 627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dstGA; 629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amCIA; 630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond; /* can be ALWAYS */ 631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } XIndir; 632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Assisted transfer to a guest address, most general case. 633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Not chainable. May be conditional. */ 634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dstGA; 636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amCIA; 637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond; /* can be ALWAYS */ 638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IRJumpKind jk; 639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } XAssisted; 640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Mov src to dst on the given condition, which may not 641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown be the bogus Pct_ALWAYS. */ 642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRI* src; 646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } CMov; 647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Zero extending loads. Dst size is host word size */ 648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 1|2|4|8 */ 650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* src; 652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Load; 653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Load-and-reserve (lwarx, ldarx) */ 654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 4|8 */ 656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } LoadL; 659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* 64/32/16/8 bit stores */ 660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 1|2|4|8 */ 662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* dst; 663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Store; 665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Store-conditional (stwcx., stdcx.) */ 666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 4|8 */ 668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } StoreC; 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Convert a ppc condition code to value 0 or 1. */ 672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Set; 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Move the entire CR to a GPR */ 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } MfCR; 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Mem fence. In short, an insn which flushes all preceding 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown loads and stores as much as possible before continuing. 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown On PPC we emit a "sync". */ 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } MFence; 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC Floating point */ 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCFpOp op; 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpUnary; 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCFpOp op; 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpBinary; 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCFpOp op; 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcML; 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcMR; 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcAcc; 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpMulAcc; 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool isLoad; 707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* only 4 (IEEE single) or 8 (IEEE double) */ 708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg; 709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* addr; 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpLdSt; 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg addr; /* int reg */ 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg data; /* float reg */ 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpSTFIW; 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Round 64-bit FP value to 32-bit FP value in an FP reg. */ 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpRSP; 720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* fcfid[u,s,us]/fctid[u]/fctiw[u]. Only some combinations 721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov of the various fields are allowed. This is asserted for 722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov and documented in the code for the constructor, 723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov PPCInstr_FpCftI, in host_ppc_defs.c. */ 724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool fromI; /* True== I->F, False== F->I */ 726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool int32; /* True== I is 32, False== I is 64 */ 727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool syned; 728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool flt64; /* True== F is 64, False== F is 32 */ 729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpCftI; 732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* FP mov src to dst on the given condition. */ 733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpCMov; 738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Load FP Status & Control Register */ 739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt dfp_rm; 742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpLdFPSCR; 743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Do a compare, generating result into an int register. */ 744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar crfD; 746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } FpCmp; 750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Read/Write Link Register */ 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool wrLR; 754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg gpr; 755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } RdWrLR; 756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Simplistic AltiVec */ 758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool isLoad; 760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 8|16|32|128 */ 761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg; 762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* addr; 763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvLdSt; 764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvUnary; 769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBinary; 775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBin8x16; 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBin16x8; 787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvOp op; 789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBin32x4; 793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvFpOp op; 795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvBin32Fx4; 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAvFpOp op; 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvUn32Fx4; 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Perm,Sel,SlDbl,Splat are all weird AV permutations */ 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg ctl; 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvPerm; 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg ctl; 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvSel; 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar shift; 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL; 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcR; 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvShlDbl; 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz; /* 8,16,32 */ 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5s* src; 827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvSplat; 828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Mov src to dst on the given condition, which may not 829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown be the bogus Xcc_ALWAYS. */ 830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst; 833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvCMov; 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Load AltiVec Status & Control Register */ 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src; 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } AvLdVSCR; 839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src; 843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp64Unary; 844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL; 848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR; 849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp64Binary; 850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src; 854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift; 855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpShift; 856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp128Unary; 863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The dst is used to pass the left source operand in and return 865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * the result. 866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi; 871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_lo; 872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp128Binary; 873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift; 880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpShift128; 881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src; 884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* r_rmc; 885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpRound; 886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* r_rmc; 892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpRound128; 893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL; 897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR; 898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* rmc; 899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpQuantize; 900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* rmc; 907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpQuantize128; 908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } ExtractExpD128; 914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL; 919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi; 920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_lo; 921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } InsertExpD128; 922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi; 926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo; 927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpD128toD64; 928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCFpOp op; 930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_hi; 931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo; 932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src; 933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } DfpI64StoD128; 934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar crfD; 936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL; 938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR; 939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp64Cmp; 940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar crfD; 942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst; 943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL_hi; 944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL_lo; 945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi; 946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_lo; 947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Dfp128Cmp; 948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amCounter; 950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amFailAddr; 951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } EvCheck; 952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng struct { 953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* No fields. The address of the counter to inc is 954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng installed later, post-translation, by patching it in, 955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng as it is not known at translation time. */ 956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } ProfInc; 957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } Pin; 958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr; 960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_LI ( HReg, ULong, Bool ); 963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Alu ( PPCAluOp, HReg, HReg, PPCRH* ); 964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Shft ( PPCShftOp, Bool sz32, HReg, HReg, PPCRH* ); 965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AddSubC ( Bool, Bool, HReg, HReg, HReg ); 966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Cmp ( Bool, Bool, UInt, HReg, PPCRH* ); 967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Unary ( PPCUnaryOp op, HReg dst, HReg src ); 968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MulL ( Bool syned, Bool hi32, Bool sz32, HReg, HReg, HReg ); 969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_Div ( Bool extended, Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR ); 970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Call ( PPCCondCode, Addr64, UInt ); 971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XDirect ( Addr64 dstGA, PPCAMode* amCIA, 972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond, Bool toFastEP ); 973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XIndir ( HReg dstGA, PPCAMode* amCIA, 974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond ); 975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_XAssisted ( HReg dstGA, PPCAMode* amCIA, 976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond, IRJumpKind jk ); 977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_CMov ( PPCCondCode, HReg dst, PPCRI* src ); 978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Load ( UChar sz, 979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, PPCAMode* src, Bool mode64 ); 980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_LoadL ( UChar sz, 981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg src, Bool mode64 ); 982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Store ( UChar sz, PPCAMode* dst, 983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg src, Bool mode64 ); 984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_StoreC ( UChar sz, HReg dst, HReg src, 985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool mode64 ); 986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_Set ( PPCCondCode cond, HReg dst ); 987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MfCR ( HReg dst ); 988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_MFence ( void ); 989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpUnary ( PPCFpOp op, HReg dst, HReg src ); 991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpBinary ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR ); 992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpMulAcc ( PPCFpOp op, HReg dst, HReg srcML, 993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcMR, HReg srcAcc ); 994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* ); 995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpSTFIW ( HReg addr, HReg data ); 996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpRSP ( HReg dst, HReg src ); 997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned, 998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool dst64, HReg dst, HReg src ); 999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpCMov ( PPCCondCode, HReg dst, HReg src ); 1000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_FpLdFPSCR ( HReg src, Bool dfp_rm ); 1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_FpCmp ( HReg dst, HReg srcL, HReg srcR ); 1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_RdWrLR ( Bool wrLR, HReg gpr ); 1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvLdSt ( Bool isLoad, UChar sz, HReg, PPCAMode* ); 1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvUnary ( PPCAvOp op, HReg dst, HReg src ); 1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBinary ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR ); 1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin8x16 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR ); 1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin16x8 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR ); 1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvBin32x4 ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR ); 1011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, HReg srcL, HReg srcR ); 1012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern PPCInstr* PPCInstr_AvUn32Fx4 ( PPCAvFpOp op, HReg dst, HReg src ); 1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvPerm ( HReg dst, HReg srcL, HReg srcR, HReg ctl ); 1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvSel ( HReg ctl, HReg dst, HReg srcL, HReg srcR ); 1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvShlDbl ( UChar shift, HReg dst, HReg srcL, HReg srcR ); 1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvSplat ( UChar sz, HReg dst, PPCVI5s* src ); 1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvCMov ( PPCCondCode, HReg dst, HReg src ); 1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern PPCInstr* PPCInstr_AvLdVSCR ( HReg src ); 1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Unary ( PPCFpOp op, HReg dst, HReg src ); 1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Binary ( PPCFpOp op, HReg dst, HReg srcL, 1022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR ); 1023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpShift ( PPCFpOp op, HReg dst, HReg src, 1024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift ); 1025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Unary ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ); 1027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Binary ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ); 1029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpShift128 ( PPCFpOp op, HReg dst_hi, HReg src_hi, 1030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg src_lo, 1031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift ); 1032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst, 1033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg src_lo); 1034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpI64StoD128 ( PPCFpOp op, HReg dst_hi, 1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg src); 1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpRound ( HReg dst, HReg src, PPCRI* r_rmc ); 1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpRound128 ( HReg dst_hi, HReg dst_lo, HReg src_hi, 1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo, PPCRI* r_rmc ); 1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpQuantize ( PPCFpOp op, HReg dst, HReg srcL, 1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR, PPCRI* rmc ); 1041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi, 1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, 1043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, 1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo, PPCRI* rmc ); 1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op, HReg dst, 1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo ); 1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_InsertExpD128 ( PPCFpOp op, HReg dst_hi, 1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg srcL, 1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ); 1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp64Cmp ( HReg dst, HReg srcL, HReg srcR ); 1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_Dfp128Cmp ( HReg dst, HReg srcL_hi, HReg srcL_lo, 1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ); 1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_EvCheck ( PPCAMode* amCounter, 1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amFailAddr ); 1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern PPCInstr* PPCInstr_ProfInc ( void ); 1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void ppPPCInstr(PPCInstr*, Bool mode64); 1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Some functions that insulate the register allocator from details 1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown of the underlying instruction set. */ 1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void getRegUsage_PPCInstr ( HRegUsage*, PPCInstr*, Bool mode64 ); 1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void mapRegs_PPCInstr ( HRegRemap*, PPCInstr* , Bool mode64); 1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool isMove_PPCInstr ( PPCInstr*, HReg*, HReg* ); 1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int emit_PPCInstr ( /*MB_MOD*/Bool* is_profInc, 1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* buf, Int nbuf, PPCInstr* i, 1067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool mode64, 1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_slowEP, 1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_fastEP, 1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xindir, 1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xassisted ); 1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genSpill_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg rreg, Int offsetB, Bool mode64 ); 1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg rreg, Int offsetB, Bool mode64 ); 1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void getAllocableRegs_PPC ( Int*, HReg**, Bool mode64 ); 1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern HInstrArray* iselSB_PPC ( IRSB*, 1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexArch, 1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexArchInfo*, 1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexAbiInfo*, 1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int offs_Host_EvC_Counter, 1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int offs_Host_EvC_FailAddr, 1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool chainingAllowed, 1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool addProfInc, 1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Addr64 max_ga ); 1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check? This is kind of a kludge because it 1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng depends on the offsets of host_EvC_FAILADDR and 1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng host_EvC_COUNTER. */ 1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Int evCheckSzB_PPC ( void ); 1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Perform a chaining and unchaining of an XDirect jump. */ 1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange chainXDirect_PPC ( void* place_to_chain, 1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_EXPECTED, 1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to, 1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ); 1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange unchainXDirect_PPC ( void* place_to_unchain, 1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to_EXPECTED, 1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me, 1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ); 1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter location into an existing ProfInc point. */ 1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexInvalRange patchProfInc_PPC ( void* place_to_patch, 1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ULong* location_of_counter, 1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ); 1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __VEX_HOST_PPC_DEFS_H */ 1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end host_ppc_defs.h ---*/ 1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 1116