1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin host_ppc_defs.c ---*/ 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#include "libvex_basictypes.h" 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex.h" 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_trc_values.h" 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "main_util.h" 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "host_generic_regs.h" 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "host_ppc_defs.h" 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Registers. --------- */ 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppHRegPPC ( HReg reg ) 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int r; 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static HChar* ireg32_names[32] 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown = { "%r0", "%r1", "%r2", "%r3", 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "%r4", "%r5", "%r6", "%r7", 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "%r8", "%r9", "%r10", "%r11", 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "%r12", "%r13", "%r14", "%r15", 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "%r16", "%r17", "%r18", "%r19", 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "%r20", "%r21", "%r22", "%r23", 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "%r24", "%r25", "%r26", "%r27", 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "%r28", "%r29", "%r30", "%r31" }; 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Be generic for all virtual regs. */ 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (hregIsVirtual(reg)) { 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHReg(reg); 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* But specific for real regs. */ 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (hregClass(reg)) { 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt64: 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = hregNumber(reg); 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r >= 0 && r < 32); 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s", ireg32_names[r]); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt32: 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = hregNumber(reg); 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r >= 0 && r < 32); 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s", ireg32_names[r]); 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcFlt64: 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = hregNumber(reg); 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r >= 0 && r < 32); 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%%fr%d", r); 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcVec128: 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = hregNumber(reg); 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r >= 0 && r < 32); 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%%v%d", r); 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("ppHRegPPC"); 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MkHRegGPR(_n, _mode64) \ 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mkHReg(_n, _mode64 ? HRcInt64 : HRcInt32, False) 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR0 ( Bool mode64 ) { return MkHRegGPR( 0, mode64); } 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR1 ( Bool mode64 ) { return MkHRegGPR( 1, mode64); } 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR2 ( Bool mode64 ) { return MkHRegGPR( 2, mode64); } 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR3 ( Bool mode64 ) { return MkHRegGPR( 3, mode64); } 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR4 ( Bool mode64 ) { return MkHRegGPR( 4, mode64); } 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR5 ( Bool mode64 ) { return MkHRegGPR( 5, mode64); } 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR6 ( Bool mode64 ) { return MkHRegGPR( 6, mode64); } 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR7 ( Bool mode64 ) { return MkHRegGPR( 7, mode64); } 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR8 ( Bool mode64 ) { return MkHRegGPR( 8, mode64); } 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR9 ( Bool mode64 ) { return MkHRegGPR( 9, mode64); } 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR10 ( Bool mode64 ) { return MkHRegGPR(10, mode64); } 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR11 ( Bool mode64 ) { return MkHRegGPR(11, mode64); } 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR12 ( Bool mode64 ) { return MkHRegGPR(12, mode64); } 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR13 ( Bool mode64 ) { return MkHRegGPR(13, mode64); } 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR14 ( Bool mode64 ) { return MkHRegGPR(14, mode64); } 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR15 ( Bool mode64 ) { return MkHRegGPR(15, mode64); } 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR16 ( Bool mode64 ) { return MkHRegGPR(16, mode64); } 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR17 ( Bool mode64 ) { return MkHRegGPR(17, mode64); } 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR18 ( Bool mode64 ) { return MkHRegGPR(18, mode64); } 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR19 ( Bool mode64 ) { return MkHRegGPR(19, mode64); } 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR20 ( Bool mode64 ) { return MkHRegGPR(20, mode64); } 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR21 ( Bool mode64 ) { return MkHRegGPR(21, mode64); } 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR22 ( Bool mode64 ) { return MkHRegGPR(22, mode64); } 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR23 ( Bool mode64 ) { return MkHRegGPR(23, mode64); } 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR24 ( Bool mode64 ) { return MkHRegGPR(24, mode64); } 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR25 ( Bool mode64 ) { return MkHRegGPR(25, mode64); } 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR26 ( Bool mode64 ) { return MkHRegGPR(26, mode64); } 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR27 ( Bool mode64 ) { return MkHRegGPR(27, mode64); } 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR28 ( Bool mode64 ) { return MkHRegGPR(28, mode64); } 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR29 ( Bool mode64 ) { return MkHRegGPR(29, mode64); } 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR30 ( Bool mode64 ) { return MkHRegGPR(30, mode64); } 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_GPR31 ( Bool mode64 ) { return MkHRegGPR(31, mode64); } 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef MK_INT_HREG 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR0 ( void ) { return mkHReg( 0, HRcFlt64, False); } 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR1 ( void ) { return mkHReg( 1, HRcFlt64, False); } 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR2 ( void ) { return mkHReg( 2, HRcFlt64, False); } 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR3 ( void ) { return mkHReg( 3, HRcFlt64, False); } 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR4 ( void ) { return mkHReg( 4, HRcFlt64, False); } 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR5 ( void ) { return mkHReg( 5, HRcFlt64, False); } 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR6 ( void ) { return mkHReg( 6, HRcFlt64, False); } 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR7 ( void ) { return mkHReg( 7, HRcFlt64, False); } 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR8 ( void ) { return mkHReg( 8, HRcFlt64, False); } 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR9 ( void ) { return mkHReg( 9, HRcFlt64, False); } 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR10 ( void ) { return mkHReg(10, HRcFlt64, False); } 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR11 ( void ) { return mkHReg(11, HRcFlt64, False); } 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR12 ( void ) { return mkHReg(12, HRcFlt64, False); } 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR13 ( void ) { return mkHReg(13, HRcFlt64, False); } 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR14 ( void ) { return mkHReg(14, HRcFlt64, False); } 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR15 ( void ) { return mkHReg(15, HRcFlt64, False); } 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR16 ( void ) { return mkHReg(16, HRcFlt64, False); } 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR17 ( void ) { return mkHReg(17, HRcFlt64, False); } 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR18 ( void ) { return mkHReg(18, HRcFlt64, False); } 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR19 ( void ) { return mkHReg(19, HRcFlt64, False); } 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR20 ( void ) { return mkHReg(20, HRcFlt64, False); } 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR21 ( void ) { return mkHReg(21, HRcFlt64, False); } 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR22 ( void ) { return mkHReg(22, HRcFlt64, False); } 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR23 ( void ) { return mkHReg(23, HRcFlt64, False); } 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR24 ( void ) { return mkHReg(24, HRcFlt64, False); } 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR25 ( void ) { return mkHReg(25, HRcFlt64, False); } 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR26 ( void ) { return mkHReg(26, HRcFlt64, False); } 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR27 ( void ) { return mkHReg(27, HRcFlt64, False); } 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR28 ( void ) { return mkHReg(28, HRcFlt64, False); } 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR29 ( void ) { return mkHReg(29, HRcFlt64, False); } 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR30 ( void ) { return mkHReg(30, HRcFlt64, False); } 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_FPR31 ( void ) { return mkHReg(31, HRcFlt64, False); } 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR0 ( void ) { return mkHReg( 0, HRcVec128, False); } 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR1 ( void ) { return mkHReg( 1, HRcVec128, False); } 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR2 ( void ) { return mkHReg( 2, HRcVec128, False); } 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR3 ( void ) { return mkHReg( 3, HRcVec128, False); } 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR4 ( void ) { return mkHReg( 4, HRcVec128, False); } 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR5 ( void ) { return mkHReg( 5, HRcVec128, False); } 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR6 ( void ) { return mkHReg( 6, HRcVec128, False); } 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR7 ( void ) { return mkHReg( 7, HRcVec128, False); } 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR8 ( void ) { return mkHReg( 8, HRcVec128, False); } 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR9 ( void ) { return mkHReg( 9, HRcVec128, False); } 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR10 ( void ) { return mkHReg(10, HRcVec128, False); } 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR11 ( void ) { return mkHReg(11, HRcVec128, False); } 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR12 ( void ) { return mkHReg(12, HRcVec128, False); } 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR13 ( void ) { return mkHReg(13, HRcVec128, False); } 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR14 ( void ) { return mkHReg(14, HRcVec128, False); } 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR15 ( void ) { return mkHReg(15, HRcVec128, False); } 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR16 ( void ) { return mkHReg(16, HRcVec128, False); } 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR17 ( void ) { return mkHReg(17, HRcVec128, False); } 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR18 ( void ) { return mkHReg(18, HRcVec128, False); } 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR19 ( void ) { return mkHReg(19, HRcVec128, False); } 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR20 ( void ) { return mkHReg(20, HRcVec128, False); } 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR21 ( void ) { return mkHReg(21, HRcVec128, False); } 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR22 ( void ) { return mkHReg(22, HRcVec128, False); } 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR23 ( void ) { return mkHReg(23, HRcVec128, False); } 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR24 ( void ) { return mkHReg(24, HRcVec128, False); } 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR25 ( void ) { return mkHReg(25, HRcVec128, False); } 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR26 ( void ) { return mkHReg(26, HRcVec128, False); } 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR27 ( void ) { return mkHReg(27, HRcVec128, False); } 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR28 ( void ) { return mkHReg(28, HRcVec128, False); } 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR29 ( void ) { return mkHReg(29, HRcVec128, False); } 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR30 ( void ) { return mkHReg(30, HRcVec128, False); } 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHReg hregPPC_VR31 ( void ) { return mkHReg(31, HRcVec128, False); } 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid getAllocableRegs_PPC ( Int* nregs, HReg** arr, Bool mode64 ) 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt i=0; 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mode64) 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *nregs = (32-9) + (32-24) + (32-24); 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *nregs = (32-7) + (32-24) + (32-24); 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *arr = LibVEX_Alloc(*nregs * sizeof(HReg)); 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // GPR0 = scratch reg where poss. - some ops interpret as value zero 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // GPR1 = stack pointer 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // GPR2 = TOC pointer 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR3(mode64); 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR4(mode64); 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR5(mode64); 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR6(mode64); 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR7(mode64); 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR8(mode64); 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR9(mode64); 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR10(mode64); 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) { 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* in mode64: 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r11 used for calls by ptr / env ptr for some langs 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r12 used for exception handling and global linkage code */ 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR11(mode64); 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR12(mode64); 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // GPR13 = thread specific pointer 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // GPR14 and above are callee save. Yay. 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR14(mode64); 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR15(mode64); 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR16(mode64); 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR17(mode64); 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR18(mode64); 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR19(mode64); 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR20(mode64); 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR21(mode64); 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR22(mode64); 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR23(mode64); 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR24(mode64); 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR25(mode64); 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR26(mode64); 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR27(mode64); 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_GPR28(mode64); 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // GPR29 is reserved for the dispatcher 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // GPR30 is reserved as AltiVec spill reg temporary 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // GPR31 is reserved for the GuestStatePtr 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Don't waste the reg-allocs's time trawling through zillions of 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FP registers - they mostly will never be used. We'll tolerate 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the occasional extra spill instead. */ 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For both ppc32-linux and ppc64-linux, f14-f31 are callee save. 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown So use them. */ 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_FPR14(); 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_FPR15(); 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_FPR16(); 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_FPR17(); 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_FPR18(); 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_FPR19(); 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_FPR20(); 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_FPR21(); 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Same deal re Altivec */ 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For both ppc32-linux and ppc64-linux, v20-v31 are callee save. 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown So use them. */ 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* NB, vr29 is used as a scratch temporary -- do not allocate */ 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_VR20(); 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_VR21(); 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_VR22(); 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_VR23(); 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_VR24(); 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_VR25(); 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_VR26(); 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (*arr)[i++] = hregPPC_VR27(); 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(i == *nregs); 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Condition codes, Intel encoding. --------- */ 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCCondCode ( PPCCondCode cond ) 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test == Pct_ALWAYS) return "always"; 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (cond.flag) { 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pcf_7SO: 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return (cond.test == Pct_TRUE) ? "cr7.so=1" : "cr7.so=0"; 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pcf_7EQ: 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return (cond.test == Pct_TRUE) ? "cr7.eq=1" : "cr7.eq=0"; 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pcf_7GT: 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return (cond.test == Pct_TRUE) ? "cr7.gt=1" : "cr7.gt=0"; 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pcf_7LT: 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return (cond.test == Pct_TRUE) ? "cr7.lt=1" : "cr7.lt=0"; 289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case Pcf_NONE: 290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return "no-flag"; 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("ppPPCCondCode"); 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* construct condition code */ 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCCondCode mk_PPCCondCode ( PPCCondTest test, PPCCondFlag flag ) 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cc; 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cc.flag = flag; 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cc.test = test; 301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (test == Pct_ALWAYS) { 302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vassert(flag == Pcf_NONE); 303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vassert(flag != Pcf_NONE); 305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return cc; 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* false->true, true->false */ 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCCondTest invertCondTest ( PPCCondTest ct ) 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(ct != Pct_ALWAYS); 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return (ct == Pct_TRUE) ? Pct_FALSE : Pct_TRUE; 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- PPCAMode: memory address expressions. --------- */ 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCAMode* PPCAMode_IR ( Int idx, HReg base ) { 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am = LibVEX_Alloc(sizeof(PPCAMode)); 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(idx >= -0x8000 && idx < 0x8000); 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am->tag = Pam_IR; 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am->Pam.IR.base = base; 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am->Pam.IR.index = idx; 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return am; 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCAMode* PPCAMode_RR ( HReg idx, HReg base ) { 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am = LibVEX_Alloc(sizeof(PPCAMode)); 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am->tag = Pam_RR; 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am->Pam.RR.base = base; 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am->Pam.RR.index = idx; 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return am; 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCAMode* dopyPPCAMode ( PPCAMode* am ) { 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (am->tag) { 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_IR: 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return PPCAMode_IR( am->Pam.IR.index, am->Pam.IR.base ); 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_RR: 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return PPCAMode_RR( am->Pam.RR.index, am->Pam.RR.base ); 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("dopyPPCAMode"); 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCAMode ( PPCAMode* am ) { 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (am->tag) { 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_IR: 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (am->Pam.IR.index == 0) 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("0("); 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%d(", (Int)am->Pam.IR.index); 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(am->Pam.IR.base); 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(")"); 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_RR: 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(am->Pam.RR.base); 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(am->Pam.RR.index); 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("ppPPCAMode"); 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void addRegUsage_PPCAMode ( HRegUsage* u, PPCAMode* am ) { 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (am->tag) { 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_IR: 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, am->Pam.IR.base); 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_RR: 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, am->Pam.RR.base); 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, am->Pam.RR.index); 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("addRegUsage_PPCAMode"); 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapRegs_PPCAMode ( HRegRemap* m, PPCAMode* am ) { 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (am->tag) { 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_IR: 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am->Pam.IR.base = lookupHRegRemap(m, am->Pam.IR.base); 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_RR: 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am->Pam.RR.base = lookupHRegRemap(m, am->Pam.RR.base); 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am->Pam.RR.index = lookupHRegRemap(m, am->Pam.RR.index); 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("mapRegs_PPCAMode"); 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u16/s16. --------- */ 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCRH* PPCRH_Imm ( Bool syned, UShort imm16 ) { 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* op = LibVEX_Alloc(sizeof(PPCRH)); 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->tag = Prh_Imm; 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->Prh.Imm.syned = syned; 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->Prh.Imm.imm16 = imm16; 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* If this is a signed value, ensure it's not -32768, so that we 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown are guaranteed always to be able to negate if needed. */ 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(imm16 != 0x8000); 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(syned == True || syned == False); 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return op; 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCRH* PPCRH_Reg ( HReg reg ) { 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* op = LibVEX_Alloc(sizeof(PPCRH)); 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->tag = Prh_Reg; 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->Prh.Reg.reg = reg; 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return op; 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCRH ( PPCRH* op ) { 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op->tag) { 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Imm: 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (op->Prh.Imm.syned) 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%d", (Int)(Short)op->Prh.Imm.imm16); 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%u", (UInt)(UShort)op->Prh.Imm.imm16); 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Reg: 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(op->Prh.Reg.reg); 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("ppPPCRH"); 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* An PPCRH can only be used in a "read" context (what would it mean 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to write or modify a literal?) and so we enumerate its registers 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown accordingly. */ 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void addRegUsage_PPCRH ( HRegUsage* u, PPCRH* op ) { 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op->tag) { 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Imm: 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Reg: 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, op->Prh.Reg.reg); 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("addRegUsage_PPCRH"); 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapRegs_PPCRH ( HRegRemap* m, PPCRH* op ) { 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op->tag) { 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Imm: 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Reg: 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->Prh.Reg.reg = lookupHRegRemap(m, op->Prh.Reg.reg); 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("mapRegs_PPCRH"); 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a reg or a u32/64. --------- */ 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCRI* PPCRI_Imm ( ULong imm64 ) { 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRI* op = LibVEX_Alloc(sizeof(PPCRI)); 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->tag = Pri_Imm; 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->Pri.Imm = imm64; 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return op; 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCRI* PPCRI_Reg ( HReg reg ) { 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRI* op = LibVEX_Alloc(sizeof(PPCRI)); 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->tag = Pri_Reg; 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->Pri.Reg = reg; 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return op; 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCRI ( PPCRI* dst ) { 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (dst->tag) { 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Imm: 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("0x%llx", dst->Pri.Imm); 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Reg: 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(dst->Pri.Reg); 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("ppPPCRI"); 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* An PPCRI can only be used in a "read" context (what would it 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mean to write or modify a literal?) and so we enumerate its 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown registers accordingly. */ 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void addRegUsage_PPCRI ( HRegUsage* u, PPCRI* dst ) { 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (dst->tag) { 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Imm: 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Reg: 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, dst->Pri.Reg); 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("addRegUsage_PPCRI"); 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapRegs_PPCRI ( HRegRemap* m, PPCRI* dst ) { 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (dst->tag) { 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Imm: 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Reg: 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown dst->Pri.Reg = lookupHRegRemap(m, dst->Pri.Reg); 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("mapRegs_PPCRI"); 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Operand, which can be a vector reg or a simm5. --------- */ 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCVI5s* PPCVI5s_Imm ( Char simm5 ) { 518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5s* op = LibVEX_Alloc(sizeof(PPCVI5s)); 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->tag = Pvi_Imm; 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->Pvi.Imm5s = simm5; 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(simm5 >= -16 && simm5 <= 15); 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return op; 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCVI5s* PPCVI5s_Reg ( HReg reg ) { 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCVI5s* op = LibVEX_Alloc(sizeof(PPCVI5s)); 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->tag = Pvi_Reg; 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown op->Pvi.Reg = reg; 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(hregClass(reg) == HRcVec128); 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return op; 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCVI5s ( PPCVI5s* src ) { 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (src->tag) { 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pvi_Imm: 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%d", (Int)src->Pvi.Imm5s); 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pvi_Reg: 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(src->Pvi.Reg); 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("ppPPCVI5s"); 542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* An PPCVI5s can only be used in a "read" context (what would it 546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mean to write or modify a literal?) and so we enumerate its 547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown registers accordingly. */ 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void addRegUsage_PPCVI5s ( HRegUsage* u, PPCVI5s* dst ) { 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (dst->tag) { 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pvi_Imm: 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pvi_Reg: 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, dst->Pvi.Reg); 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("addRegUsage_PPCVI5s"); 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapRegs_PPCVI5s ( HRegRemap* m, PPCVI5s* dst ) { 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (dst->tag) { 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pvi_Imm: 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pvi_Reg: 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown dst->Pvi.Reg = lookupHRegRemap(m, dst->Pvi.Reg); 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("mapRegs_PPCVI5s"); 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Instructions. --------- */ 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCUnaryOp ( PPCUnaryOp op ) { 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op) { 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_NOT: return "not"; 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_NEG: return "neg"; 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_CLZ32: return "cntlzw"; 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_CLZ64: return "cntlzd"; 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_EXTSW: return "extsw"; 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("showPPCUnaryOp"); 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCAluOp ( PPCAluOp op, Bool immR ) { 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op) { 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_ADD: return immR ? "addi" : "add"; 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_SUB: return immR ? "subi" : "sub"; 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_AND: return immR ? "andi." : "and"; 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_OR: return immR ? "ori" : "or"; 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_XOR: return immR ? "xori" : "xor"; 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("showPPCAluOp"); 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCShftOp ( PPCShftOp op, Bool immR, Bool sz32 ) { 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op) { 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pshft_SHL: return sz32 ? (immR ? "slwi" : "slw") : 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (immR ? "sldi" : "sld"); 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pshft_SHR: return sz32 ? (immR ? "srwi" : "srw") : 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (immR ? "srdi" : "srd"); 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pshft_SAR: return sz32 ? (immR ? "srawi" : "sraw") : 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (immR ? "sradi" : "srad"); 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("showPPCShftOp"); 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCFpOp ( PPCFpOp op ) { 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op) { 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_ADDD: return "fadd"; 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_SUBD: return "fsub"; 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MULD: return "fmul"; 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_DIVD: return "fdiv"; 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MADDD: return "fmadd"; 616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MSUBD: return "fmsub"; 617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MADDS: return "fmadds"; 618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MSUBS: return "fmsubs"; 619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_ADDS: return "fadds"; 620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_SUBS: return "fsubs"; 621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MULS: return "fmuls"; 622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_DIVS: return "fdivs"; 623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_SQRT: return "fsqrt"; 624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_ABS: return "fabs"; 625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_NEG: return "fneg"; 626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MOV: return "fmr"; 627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_RES: return "fres"; 628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_RSQRTE: return "frsqrte"; 629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIM: return "frim"; 630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIN: return "frin"; 631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIP: return "frip"; 632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIZ: return "friz"; 633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPADD: return "dadd"; 634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPADDQ: return "daddq"; 635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPSUB: return "dsub"; 636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPSUBQ: return "dsubq"; 637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPMUL: return "dmul"; 638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPMULQ: return "dmulq"; 639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPDIV: return "ddivd"; 640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPDIVQ: return "ddivq"; 641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTDP: return "dctdp"; 642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DRSP: return "drsp"; 643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTFIX: return "dctfix"; 644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCFFIX: return "dcffix"; 645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTQPQ: return "dctqpq"; 646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCFFIXQ: return "dcffixq"; 647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DQUA: return "dqua"; 648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DQUAQ: return "dquaq"; 649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DXEX: return "dxex"; 650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DXEXQ: return "dxexq"; 651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DIEX: return "diex"; 652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DIEXQ: return "diexq"; 653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_RRDTR: return "rrdtr"; 654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("showPPCFpOp"); 655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCAvOp ( PPCAvOp op ) { 659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op) { 660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Unary */ 662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MOV: return "vmr"; /* Mov */ 663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AND: return "vand"; /* Bitwise */ 665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OR: return "vor"; 666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_XOR: return "vxor"; 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_NOT: return "vnot"; 668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKH8S: return "vupkhsb"; /* Unpack */ 670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKH16S: return "vupkhsh"; 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKL8S: return "vupklsb"; 672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKL16S: return "vupklsh"; 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKHPIX: return "vupkhpx"; 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKLPIX: return "vupklpx"; 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Integer binary */ 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ADDU: return "vaddu_m"; // b,h,w 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDU: return "vaddu_s"; // b,h,w 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDS: return "vadds_s"; // b,h,w 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SUBU: return "vsubu_m"; // b,h,w 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBU: return "vsubu_s"; // b,h,w 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBS: return "vsubs_s"; // b,h,w 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULU: return "vmulou"; // b,h 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULS: return "vmulos"; // b,h 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULU: return "vmuleu"; // b,h 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULS: return "vmules"; // b,h 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGU: return "vavgu"; // b,h,w 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGS: return "vavgs"; // b,h,w 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXU: return "vmaxu"; // b,h,w 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXS: return "vmaxs"; // b,h,w 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINU: return "vminu"; // b,h,w 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINS: return "vmins"; // b,h,w 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Compare (always affects CR field 6) */ 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPEQU: return "vcmpequ"; // b,h,w 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTU: return "vcmpgtu"; // b,h,w 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTS: return "vcmpgts"; // b,h,w 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Shift */ 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHL: return "vsl"; // ' ',b,h,w 706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHR: return "vsr"; // ' ',b,h,w 707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SAR: return "vsra"; // b,h,w 708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ROTL: return "vrl"; // b,h,w 709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Pack */ 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_PACKUU: return "vpku_um"; // h,w 712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKUU: return "vpku_us"; // h,w 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSU: return "vpks_us"; // h,w 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSS: return "vpks_ss"; // h,w 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_PACKPXL: return "vpkpx"; 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Merge */ 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGHI: return "vmrgh"; // b,h,w 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGLO: return "vmrgl"; // b,h,w 720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("showPPCAvOp"); 722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownHChar* showPPCAvFpOp ( PPCAvFpOp op ) { 726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op) { 727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Floating Point Binary */ 728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ADDF: return "vaddfp"; 729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_SUBF: return "vsubfp"; 730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MULF: return "vmaddfp"; 731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MAXF: return "vmaxfp"; 732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MINF: return "vminfp"; 733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPEQF: return "vcmpeqfp"; 734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPGTF: return "vcmpgtfp"; 735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPGEF: return "vcmpgefp"; 736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Floating Point Unary */ 738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_RCPF: return "vrefp"; 739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_RSQRTF: return "vrsqrtefp"; 740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CVTU2F: return "vcfux"; 741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CVTS2F: return "vcfsx"; 742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_QCVTF2U: return "vctuxs"; 743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_QCVTF2S: return "vctsxs"; 744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDM: return "vrfim"; 745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDP: return "vrfip"; 746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDN: return "vrfin"; 747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDZ: return "vrfiz"; 748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("showPPCAvFpOp"); 750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_LI ( HReg dst, ULong imm64, Bool mode64 ) 754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_LI; 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LI.dst = dst; 758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LI.imm64 = imm64; 759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) 760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert( (Long)imm64 == (Long)(Int)(UInt)imm64 ); 761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Alu ( PPCAluOp op, HReg dst, 764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, PPCRH* srcR ) { 765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Alu; 767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Alu.op = op; 768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Alu.dst = dst; 769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Alu.srcL = srcL; 770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Alu.srcR = srcR; 771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Shft ( PPCShftOp op, Bool sz32, 774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg srcL, PPCRH* srcR ) { 775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Shft; 777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.op = op; 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.sz32 = sz32; 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.dst = dst; 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.srcL = srcL; 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.srcR = srcR; 782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AddSubC ( Bool isAdd, Bool setC, 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg srcL, HReg srcR ) { 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AddSubC; 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.isAdd = isAdd; 789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.setC = setC; 790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.dst = dst; 791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.srcL = srcL; 792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.srcR = srcR; 793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Cmp ( Bool syned, Bool sz32, 796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt crfD, HReg srcL, PPCRH* srcR ) { 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Cmp; 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.syned = syned; 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.sz32 = sz32; 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.crfD = crfD; 802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.srcL = srcL; 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.srcR = srcR; 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Unary ( PPCUnaryOp op, HReg dst, HReg src ) { 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Unary; 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Unary.op = op; 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Unary.dst = dst; 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Unary.src = src; 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MulL ( Bool syned, Bool hi, Bool sz32, 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg srcL, HReg srcR ) { 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_MulL; 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.syned = syned; 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.hi = hi; 820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.sz32 = sz32; 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.dst = dst; 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.srcL = srcL; 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.srcR = srcR; 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* if doing the low word, the signedness is irrelevant, but tie it 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown down anyway. */ 826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!hi) vassert(!syned); 827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_Div ( Bool extended, Bool syned, Bool sz32, 830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg srcL, HReg srcR ) { 831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Div; 833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov i->Pin.Div.extended = extended; 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.syned = syned; 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.sz32 = sz32; 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.dst = dst; 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.srcL = srcL; 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.srcR = srcR; 839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Call ( PPCCondCode cond, 842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr64 target, UInt argiregs ) { 843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt mask; 844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Call; 846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Call.cond = cond; 847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Call.target = target; 848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Call.argiregs = argiregs; 849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Only r3 .. r10 inclusive may be used as arg regs. Hence: */ 850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mask = (1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10); 851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (argiregs & ~mask)); 852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 854663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XDirect ( Addr64 dstGA, PPCAMode* amCIA, 855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond, Bool toFastEP ) { 856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_XDirect; 858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.dstGA = dstGA; 859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.amCIA = amCIA; 860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.cond = cond; 861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.toFastEP = toFastEP; 862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 864663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XIndir ( HReg dstGA, PPCAMode* amCIA, 865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond ) { 866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_XIndir; 868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.dstGA = dstGA; 869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.amCIA = amCIA; 870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.cond = cond; 871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 873663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XAssisted ( HReg dstGA, PPCAMode* amCIA, 874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond, IRJumpKind jk ) { 875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_XAssisted; 877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.dstGA = dstGA; 878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.amCIA = amCIA; 879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.cond = cond; 880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.jk = jk; 881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_CMov ( PPCCondCode cond, 884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, PPCRI* src ) { 885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_CMov; 887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.CMov.cond = cond; 888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.CMov.src = src; 889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.CMov.dst = dst; 890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cond.test != Pct_ALWAYS); 891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Load ( UChar sz, 894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, PPCAMode* src, Bool mode64 ) { 895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Load; 897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Load.sz = sz; 898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Load.src = src; 899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Load.dst = dst; 900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8); 901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz == 8) vassert(mode64); 902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_LoadL ( UChar sz, 905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg src, Bool mode64 ) 906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_LoadL; 909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LoadL.sz = sz; 910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LoadL.src = src; 911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LoadL.dst = dst; 912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 4 || sz == 8); 913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz == 8) vassert(mode64); 914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Store ( UChar sz, PPCAMode* dst, HReg src, 917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool mode64 ) { 918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Store; 920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Store.sz = sz; 921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Store.src = src; 922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Store.dst = dst; 923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8); 924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz == 8) vassert(mode64); 925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_StoreC ( UChar sz, HReg dst, HReg src, Bool mode64 ) { 928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_StoreC; 930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.StoreC.sz = sz; 931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.StoreC.src = src; 932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.StoreC.dst = dst; 933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 4 || sz == 8); 934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz == 8) vassert(mode64); 935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Set ( PPCCondCode cond, HReg dst ) { 938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Set; 940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Set.cond = cond; 941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Set.dst = dst; 942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MfCR ( HReg dst ) 945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_MfCR; 948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MfCR.dst = dst; 949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MFence ( void ) 952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_MFence; 955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpUnary ( PPCFpOp op, HReg dst, HReg src ) { 959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpUnary; 961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpUnary.op = op; 962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpUnary.dst = dst; 963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpUnary.src = src; 964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpBinary ( PPCFpOp op, HReg dst, 967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpBinary; 970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpBinary.op = op; 971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpBinary.dst = dst; 972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpBinary.srcL = srcL; 973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpBinary.srcR = srcR; 974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpMulAcc ( PPCFpOp op, HReg dst, HReg srcML, 977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcMR, HReg srcAcc ) 978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpMulAcc; 981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.op = op; 982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.dst = dst; 983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.srcML = srcML; 984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.srcMR = srcMR; 985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.srcAcc = srcAcc; 986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpLdSt ( Bool isLoad, UChar sz, 989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg, PPCAMode* addr ) { 990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpLdSt; 992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.isLoad = isLoad; 993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.sz = sz; 994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.reg = reg; 995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.addr = addr; 996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 4 || sz == 8); 997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpSTFIW ( HReg addr, HReg data ) 1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpSTFIW; 1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpSTFIW.addr = addr; 1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpSTFIW.data = data; 1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpRSP ( HReg dst, HReg src ) { 1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpRSP; 1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpRSP.dst = dst; 1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpRSP.src = src; 1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1014663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Unary(PPCFpOp op, HReg dst, HReg src) { 1015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) ); 1016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp64Unary; 1017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Unary.op = op; 1018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Unary.dst = dst; 1019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Unary.src = src; 1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1022663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Binary(PPCFpOp op, HReg dst, HReg srcL, HReg srcR) { 1023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) ); 1024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp64Binary; 1025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Binary.op = op; 1026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Binary.dst = dst; 1027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Binary.srcL = srcL; 1028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Binary.srcR = srcR; 1029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1031663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpShift ( PPCFpOp op, HReg dst, HReg src, PPCRI* shift ) { 1032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpShift; 1034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift.op = op; 1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift.shift = shift; 1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift.src = src; 1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift.dst = dst; 1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Unary(PPCFpOp op, HReg dst_hi, HReg dst_lo, 1041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo) { 1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) ); 1043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp128Unary; 1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.op = op; 1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.dst_hi = dst_hi; 1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.dst_lo = dst_lo; 1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.src_hi = src_hi; 1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.src_lo = src_lo; 1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Binary(PPCFpOp op, HReg dst_hi, HReg dst_lo, 1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo) { 1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to pass the srcL argument and return the result */ 1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) ); 1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp128Binary; 1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.op = op; 1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.dst_hi = dst_hi; 1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.dst_lo = dst_lo; 1059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.srcR_hi = srcR_hi; 1060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.srcR_lo = srcR_lo; 1061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1063663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpShift128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo, 1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift ) { 1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpShift128; 1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.op = op; 1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.shift = shift; 1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.src_hi = src_hi; 1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.src_lo = src_lo; 1072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.dst_hi = dst_hi; 1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.dst_lo = dst_lo; 1074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1076663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpRound ( HReg dst, HReg src, PPCRI* r_rmc ) { 1077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpRound; 1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound.dst = dst; 1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound.src = src; 1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound.r_rmc = r_rmc; 1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpRound128 ( HReg dst_hi, HReg dst_lo, HReg src_hi, 1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo, PPCRI* r_rmc ) { 1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpRound128; 1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.dst_hi = dst_hi; 1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.dst_lo = dst_lo; 1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.src_hi = src_hi; 1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.src_lo = src_lo; 1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.r_rmc = r_rmc; 1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpQuantize ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR, 1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* rmc ) { 1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpQuantize; 1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.op = op; 1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.dst = dst; 1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.srcL = srcL; 1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.srcR = srcR; 1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.rmc = rmc; 1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo, PPCRI* rmc ) { 1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to pass left operand in and return result */ 1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpQuantize128; 1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.op = op; 1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.dst_hi = dst_hi; 1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.dst_lo = dst_lo; 1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.src_hi = src_hi; 1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.src_lo = src_lo; 1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.rmc = rmc; 1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst, 1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo ) { 1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpD128toD64; 1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpD128toD64.op = op; 1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpD128toD64.src_hi = src_hi; 1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpD128toD64.src_lo = src_lo; 1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpD128toD64.dst = dst; 1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpI64StoD128 ( PPCFpOp op, HReg dst_hi, 1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg src ) { 1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpI64StoD128; 1133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpI64StoD128.op = op; 1134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpI64StoD128.src = src; 1135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpI64StoD128.dst_hi = dst_hi; 1136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpI64StoD128.dst_lo = dst_lo; 1137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op, HReg dst, 1140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo ) { 1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to pass the srcL argument */ 1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_ExtractExpD128; 1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.ExtractExpD128.op = op; 1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.ExtractExpD128.dst = dst; 1146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.ExtractExpD128.src_hi = src_hi; 1147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.ExtractExpD128.src_lo = src_lo; 1148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1150663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_InsertExpD128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL, HReg srcR_hi, HReg srcR_lo ) { 1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to pass the srcL argument */ 1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_InsertExpD128; 1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.op = op; 1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.dst_hi = dst_hi; 1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.dst_lo = dst_lo; 1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.srcL = srcL; 1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.srcR_hi = srcR_hi; 1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.srcR_lo = srcR_lo; 1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Cmp (/* UInt crfD,*/ HReg dst, HReg srcL, HReg srcR ) { 1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp64Cmp; 1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Cmp.dst = dst; 1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Cmp.srcL = srcL; 1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Cmp.srcR = srcR; 1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Cmp ( HReg dst, HReg srcL_hi, HReg srcL_lo, 1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ) { 1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp128Cmp; 1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.dst = dst; 1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.srcL_hi = srcL_hi; 1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.srcL_lo = srcL_lo; 1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.srcR_hi = srcR_hi; 1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.srcR_lo = srcR_lo; 1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_EvCheck ( PPCAMode* amCounter, 1183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amFailAddr ) { 1184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_EvCheck; 1186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amCounter = amCounter; 1187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amFailAddr = amFailAddr; 1188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1190663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_ProfInc ( void ) { 1191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_ProfInc; 1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* 1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovValid combo | fromI | int32 | syned | flt64 | 1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | n n n n | 1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I64U | n n n y | 1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | n n y n | 1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I64S | n n y y | 1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | n y n n | 1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I32U | n y n y | 1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | n y y n | 1212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I32S | n y y y | 1214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64U->F32 | y n n n | 1216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64U->F64 | y n n y | 1218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y n y n | 1220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64S->F64 | y n y y | 1222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y y n n | 1224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y y n y | 1226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y y y n | 1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y y y y | 1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/ 1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned, 1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool flt64, HReg dst, HReg src ) { 1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool tmp = fromI | int32 | syned | flt64; 1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vassert(tmp == True || tmp == False); // iow, no high bits set 1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UShort conversion = 0; 1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov conversion = (fromI << 3) | (int32 << 2) | (syned << 1) | flt64; 1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (conversion) { 1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // Supported conversion operations 1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 1: case 3: case 5: case 7: 1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 8: case 9: case 11: 1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vpanic("PPCInstr_FpCftI(ppc_host)"); 1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpCftI; 1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCftI.fromI = fromI; 1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCftI.int32 = int32; 1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov i->Pin.FpCftI.syned = syned; 1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov i->Pin.FpCftI.flt64 = flt64; 1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCftI.dst = dst; 1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCftI.src = src; 1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpCMov ( PPCCondCode cond, HReg dst, HReg src ) { 1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpCMov; 1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCMov.cond = cond; 1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCMov.dst = dst; 1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCMov.src = src; 1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cond.test != Pct_ALWAYS); 1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1265663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_FpLdFPSCR ( HReg src, Bool dfp_rm ) { 1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpLdFPSCR; 1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdFPSCR.src = src; 1269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.FpLdFPSCR.dfp_rm = dfp_rm ? 1 : 0; 1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpCmp ( HReg dst, HReg srcL, HReg srcR ) { 1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpCmp; 1275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCmp.dst = dst; 1276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCmp.srcL = srcL; 1277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCmp.srcR = srcR; 1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Read/Write Link Register */ 1282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_RdWrLR ( Bool wrLR, HReg gpr ) { 1283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_RdWrLR; 1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.RdWrLR.wrLR = wrLR; 1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.RdWrLR.gpr = gpr; 1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* AltiVec */ 1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvLdSt ( Bool isLoad, UChar sz, 1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg, PPCAMode* addr ) { 1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvLdSt; 1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.isLoad = isLoad; 1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.sz = sz; 1297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.reg = reg; 1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.addr = addr; 1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvUnary ( PPCAvOp op, HReg dst, HReg src ) { 1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvUnary; 1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUnary.op = op; 1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUnary.dst = dst; 1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUnary.src = src; 1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBinary ( PPCAvOp op, HReg dst, 1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBinary; 1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBinary.op = op; 1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBinary.dst = dst; 1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBinary.srcL = srcL; 1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBinary.srcR = srcR; 1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin8x16 ( PPCAvOp op, HReg dst, 1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBin8x16; 1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin8x16.op = op; 1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin8x16.dst = dst; 1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin8x16.srcL = srcL; 1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin8x16.srcR = srcR; 1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin16x8 ( PPCAvOp op, HReg dst, 1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBin16x8; 1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin16x8.op = op; 1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin16x8.dst = dst; 1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin16x8.srcL = srcL; 1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin16x8.srcR = srcR; 1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin32x4 ( PPCAvOp op, HReg dst, 1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBin32x4; 1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32x4.op = op; 1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32x4.dst = dst; 1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32x4.srcL = srcL; 1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32x4.srcR = srcR; 1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, 1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBin32Fx4; 1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32Fx4.op = op; 1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32Fx4.dst = dst; 1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32Fx4.srcL = srcL; 1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32Fx4.srcR = srcR; 1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_AvUn32Fx4 ( PPCAvFpOp op, HReg dst, HReg src ) { 1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvUn32Fx4; 1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUn32Fx4.op = op; 1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUn32Fx4.dst = dst; 1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUn32Fx4.src = src; 1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvPerm ( HReg dst, HReg srcL, HReg srcR, HReg ctl ) { 1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvPerm; 1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvPerm.dst = dst; 1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvPerm.srcL = srcL; 1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvPerm.srcR = srcR; 1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvPerm.ctl = ctl; 1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvSel ( HReg ctl, HReg dst, HReg srcL, HReg srcR ) { 1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvSel; 1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSel.ctl = ctl; 1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSel.dst = dst; 1381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSel.srcL = srcL; 1382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSel.srcR = srcR; 1383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvShlDbl ( UChar shift, HReg dst, 1386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvShlDbl; 1389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvShlDbl.shift = shift; 1390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvShlDbl.dst = dst; 1391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvShlDbl.srcL = srcL; 1392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvShlDbl.srcR = srcR; 1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvSplat ( UChar sz, HReg dst, PPCVI5s* src ) { 1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvSplat; 1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSplat.sz = sz; 1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSplat.dst = dst; 1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSplat.src = src; 1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvCMov ( PPCCondCode cond, HReg dst, HReg src ) { 1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvCMov; 1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvCMov.cond = cond; 1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvCMov.dst = dst; 1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvCMov.src = src; 1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cond.test != Pct_ALWAYS); 1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvLdVSCR ( HReg src ) { 1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvLdVSCR; 1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdVSCR.src = src; 1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Pretty Print instructions */ 1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void ppLoadImm ( HReg dst, ULong imm, Bool mode64 ) { 1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("li_word "); 1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(dst); 1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) { 1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",0x%08x", (UInt)imm); 1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",0x%016llx", imm); 1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void ppMovReg ( HReg dst, HReg src ) { 1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (hregNumber(dst) != hregNumber(src)) { 1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mr "); 1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(dst); 1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(src); 1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCInstr ( PPCInstr* i, Bool mode64 ) 1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->tag) { 1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LI: 1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppLoadImm(i->Pin.LI.dst, i->Pin.LI.imm64, mode64); 1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Alu: { 1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg r_srcL = i->Pin.Alu.srcL; 1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* rh_srcR = i->Pin.Alu.srcR; 1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* special-case "mr" */ 1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Alu.op == Palu_OR && // or Rd,Rs,Rs == mr Rd,Rs 1451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rh_srcR->tag == Prh_Reg && 1452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rh_srcR->Prh.Reg.reg == r_srcL) { 1453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mr "); 1454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Alu.dst); 1455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(r_srcL); 1457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* special-case "li" */ 1460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Alu.op == Palu_ADD && // addi Rd,0,imm == li Rd,imm 1461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rh_srcR->tag == Prh_Imm && 1462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown hregNumber(r_srcL) == 0) { 1463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("li "); 1464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Alu.dst); 1465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRH(rh_srcR); 1467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* generic */ 1470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAluOp(i->Pin.Alu.op, 1471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown toBool(rh_srcR->tag == Prh_Imm))); 1472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Alu.dst); 1473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(r_srcL); 1475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRH(rh_srcR); 1477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Shft: { 1480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg r_srcL = i->Pin.Shft.srcL; 1481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* rh_srcR = i->Pin.Shft.srcR; 1482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCShftOp(i->Pin.Shft.op, 1483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown toBool(rh_srcR->tag == Prh_Imm), 1484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.sz32)); 1485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Shft.dst); 1486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(r_srcL); 1488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRH(rh_srcR); 1490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AddSubC: 1493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s%s ", 1494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.isAdd ? "add" : "sub", 1495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.setC ? "c" : "e"); 1496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AddSubC.dst); 1497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AddSubC.srcL); 1499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AddSubC.srcR); 1501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Cmp: 1503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s%c%s %%cr%u,", 1504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.syned ? "cmp" : "cmpl", 1505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.sz32 ? 'w' : 'd', 1506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.srcR->tag == Prh_Imm ? "i" : "", 1507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.crfD); 1508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Cmp.srcL); 1509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRH(i->Pin.Cmp.srcR); 1511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Unary: 1513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCUnaryOp(i->Pin.Unary.op)); 1514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Unary.dst); 1515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Unary.src); 1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MulL: 1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mul%c%c%s ", 1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.hi ? 'h' : 'l', 1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.sz32 ? 'w' : 'd', 1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.hi ? (i->Pin.MulL.syned ? "s" : "u") : ""); 1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.MulL.dst); 1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.MulL.srcL); 1526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.MulL.srcR); 1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Div: 1530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vex_printf("div%c%s%s ", 1531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.sz32 ? 'w' : 'd', 1532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov i->Pin.Div.extended ? "e" : "", 1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.syned ? "" : "u"); 1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Div.dst); 1535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Div.srcL); 1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Div.srcR); 1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Call: { 1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int n; 1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("call: "); 1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Call.cond.test != Pct_ALWAYS) { 1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (%s) ", showPPCCondCode(i->Pin.Call.cond)); 1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("{ "); 1547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppLoadImm(hregPPC_GPR10(mode64), i->Pin.Call.target, mode64); 1548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" ; mtctr r10 ; bctrl ["); 1549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (n = 0; n < 32; n++) { 1550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Call.argiregs & (1<<n)) { 1551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("r%d", n); 1552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((i->Pin.Call.argiregs >> n) > 1) 1553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("] }"); 1557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 1558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XDirect: 1560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xDirect) "); 1561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (%s) { ", 1562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showPPCCondCode(i->Pin.XDirect.cond)); 1563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 1564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm64 r30,0x%llx; ", i->Pin.XDirect.dstGA); 1565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("std r30,"); 1566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm32 r30,0x%llx; ", i->Pin.XDirect.dstGA); 1568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("stw r30,"); 1569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.XDirect.amCIA); 1571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; "); 1572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 1573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm64-fixed5 r30,$disp_cp_chain_me_to_%sEP; ", 1574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.toFastEP ? "fast" : "slow"); 1575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm32-fixed2 r30,$disp_cp_chain_me_to_%sEP; ", 1577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.toFastEP ? "fast" : "slow"); 1578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mtctr r30; bctrl }"); 1580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XIndir: 1582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xIndir) "); 1583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (%s) { ", 1584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showPPCCondCode(i->Pin.XIndir.cond)); 1585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", mode64 ? "std" : "stw"); 1586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.XIndir.dstGA); 1587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.XIndir.amCIA); 1589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; "); 1590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm%s r30,$disp_cp_xindir; ", mode64 ? "64" : "32"); 1591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mtctr r30; bctr }"); 1592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XAssisted: 1594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xAssisted) "); 1595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (%s) { ", 1596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showPPCCondCode(i->Pin.XAssisted.cond)); 1597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", mode64 ? "std" : "stw"); 1598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.XAssisted.dstGA); 1599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.XAssisted.amCIA); 1601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; "); 1602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("li r31,$IRJumpKind_to_TRCVAL(%d); ", 1603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (Int)i->Pin.XAssisted.jk); 1604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm%s r30,$disp_cp_xindir; ", mode64 ? "64" : "32"); 1605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mtctr r30; bctr }"); 1606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_CMov: 1608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("cmov (%s) ", showPPCCondCode(i->Pin.CMov.cond)); 1609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.CMov.dst); 1610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRI(i->Pin.CMov.src); 1612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": "); 1613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.CMov.cond.test != Pct_ALWAYS) { 1614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (%s) ", showPPCCondCode(i->Pin.CMov.cond)); 1615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("{ "); 1617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.CMov.src->tag == Pri_Imm) { 1618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppLoadImm(i->Pin.CMov.dst, i->Pin.CMov.src->Pri.Imm, mode64); 1619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppMovReg(i->Pin.CMov.dst, i->Pin.CMov.src->Pri.Reg); 1621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Load: { 1625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.Load.src->tag == Pam_RR); 1626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.Load.sz; 1627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar c_sz = sz==1 ? 'b' : sz==2 ? 'h' : sz==4 ? 'w' : 'd'; 1628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("l%c%s%s ", c_sz, sz==8 ? "" : "z", idxd ? "x" : "" ); 1629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Load.dst); 1630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCAMode(i->Pin.Load.src); 1632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LoadL: 1635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("l%carx ", i->Pin.LoadL.sz==4 ? 'w' : 'd'); 1636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.LoadL.dst); 1637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",%%r0,"); 1638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.LoadL.src); 1639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Store: { 1641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.Store.sz; 1642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.Store.dst->tag == Pam_RR); 1643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar c_sz = sz==1 ? 'b' : sz==2 ? 'h' : sz==4 ? 'w' : /*8*/ 'd'; 1644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("st%c%s ", c_sz, idxd ? "x" : "" ); 1645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Store.src); 1646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCAMode(i->Pin.Store.dst); 1648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_StoreC: 1651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("st%ccx. ", i->Pin.StoreC.sz==4 ? 'w' : 'd'); 1652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.StoreC.src); 1653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",%%r0,"); 1654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.StoreC.dst); 1655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Set: { 1657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cc = i->Pin.Set.cond; 1658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("set (%s),", showPPCCondCode(cc)); 1659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cc.test == Pct_ALWAYS) { 1661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": { li "); 1662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",1 }"); 1664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": { mfcr r0 ; rlwinm "); 1666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",r0,%u,31,31", cc.flag+1); 1668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cc.test == Pct_FALSE) { 1669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("; xori "); 1670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",1"); 1674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MfCR: 1680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mfcr "); 1681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.MfCR.dst); 1682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 1683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MFence: 1684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mfence (=sync)"); 1685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpUnary: 1688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCFpOp(i->Pin.FpUnary.op)); 1689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpUnary.dst); 1690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpUnary.src); 1692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpBinary: 1694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCFpOp(i->Pin.FpBinary.op)); 1695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpBinary.dst); 1696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpBinary.srcL); 1698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpBinary.srcR); 1700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpMulAcc: 1702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCFpOp(i->Pin.FpMulAcc.op)); 1703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpMulAcc.dst); 1704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpMulAcc.srcML); 1706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpMulAcc.srcMR); 1708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpMulAcc.srcAcc); 1710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdSt: { 1712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.FpLdSt.sz; 1713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.FpLdSt.addr->tag == Pam_RR); 1714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpLdSt.isLoad) { 1715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("lf%c%s ", 1716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (sz==4 ? 's' : 'd'), 1717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown idxd ? "x" : "" ); 1718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpLdSt.reg); 1719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCAMode(i->Pin.FpLdSt.addr); 1721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("stf%c%s ", 1723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (sz==4 ? 's' : 'd'), 1724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown idxd ? "x" : "" ); 1725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpLdSt.reg); 1726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCAMode(i->Pin.FpLdSt.addr); 1728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpSTFIW: 1732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("stfiwz "); 1733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpSTFIW.data); 1734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",0("); 1735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpSTFIW.addr); 1736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(")"); 1737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpRSP: 1739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("frsp "); 1740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpRSP.dst); 1741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpRSP.src); 1743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCftI: { 1745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov HChar* str = "fc?????"; 1746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Note that "fcfids" is missing from below. That instruction would 1747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * satisfy the predicate: 1748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) 1749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * which would go into a final "else" clause to make this if-else 1750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * block balanced. But we're able to implement fcfids by leveraging 1751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * the fcfid implementation, so it wasn't necessary to include it here. 1752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */ 1753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == False) 1754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) 1755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fctid"; 1756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 1757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fctidu"; 1758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == True) 1759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) 1760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fctiw"; 1761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 1762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fctiwu"; 1763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else if (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) { 1764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) { 1765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fcfid"; 1766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 1767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.flt64 == True) 1768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fcfidu"; 1769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 1770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fcfidus"; 1771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", str); 1774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCftI.dst); 1775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCftI.src); 1777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCMov: 1780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("fpcmov (%s) ", showPPCCondCode(i->Pin.FpCMov.cond)); 1781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCMov.dst); 1782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCMov.src); 1784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": "); 1785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (fr_dst != fr_src) { "); 1786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCMov.cond.test != Pct_ALWAYS) { 1787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (%s) { ", showPPCCondCode(i->Pin.FpCMov.cond)); 1788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("fmr "); 1790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCMov.dst); 1791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCMov.src); 1793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCMov.cond.test != Pct_ALWAYS) 1794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdFPSCR: 1798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mtfsf 0xFF,"); 1799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpLdFPSCR.src); 1800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(",0, %s", i->Pin.FpLdFPSCR.dfp_rm ? "1" : "0"); 1801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCmp: 1803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("fcmpo %%cr1,"); 1804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.srcL); 1805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.srcR); 1807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("; mfcr "); 1808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.dst); 1809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("; rlwinm "); 1810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.dst); 1811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.dst); 1813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",8,28,31"); 1814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_RdWrLR: 1817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", i->Pin.RdWrLR.wrLR ? "mtlr" : "mflr"); 1818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.RdWrLR.gpr); 1819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdSt: { 1822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.AvLdSt.sz; 1823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HChar* str_size; 1824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvLdSt.addr->tag == Pam_IR) { 1825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppLoadImm(hregPPC_GPR30(mode64), 1826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.addr->Pam.RR.index, mode64); 1827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" ; "); 1828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown str_size = sz==1 ? "eb" : sz==2 ? "eh" : sz==4 ? "ew" : ""; 1830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvLdSt.isLoad) 1831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("lv%sx ", str_size); 1832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 1833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("stv%sx ", str_size); 1834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvLdSt.reg); 1835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvLdSt.addr->tag == Pam_IR) 1837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%%r30"); 1838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 1839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvLdSt.addr->Pam.RR.index); 1840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvLdSt.addr->Pam.RR.base); 1842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUnary: 1845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAvOp(i->Pin.AvUnary.op)); 1846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvUnary.dst); 1847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvUnary.src); 1849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBinary: 1851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAvOp(i->Pin.AvBinary.op)); 1852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBinary.dst); 1853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBinary.srcL); 1855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBinary.srcR); 1857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin8x16: 1859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s(b) ", showPPCAvOp(i->Pin.AvBin8x16.op)); 1860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin8x16.dst); 1861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin8x16.srcL); 1863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin8x16.srcR); 1865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin16x8: 1867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s(h) ", showPPCAvOp(i->Pin.AvBin16x8.op)); 1868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin16x8.dst); 1869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin16x8.srcL); 1871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin16x8.srcR); 1873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32x4: 1875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvBin32x4.op)); 1876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32x4.dst); 1877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32x4.srcL); 1879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32x4.srcR); 1881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32Fx4: 1883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAvFpOp(i->Pin.AvBin32Fx4.op)); 1884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32Fx4.dst); 1885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32Fx4.srcL); 1887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32Fx4.srcR); 1889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUn32Fx4: 1891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAvFpOp(i->Pin.AvUn32Fx4.op)); 1892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvUn32Fx4.dst); 1893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvUn32Fx4.src); 1895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvPerm: 1897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vperm "); 1898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvPerm.dst); 1899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvPerm.srcL); 1901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvPerm.srcR); 1903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvPerm.ctl); 1905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSel: 1908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vsel "); 1909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSel.dst); 1910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSel.srcL); 1912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSel.srcR); 1914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSel.ctl); 1916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvShlDbl: 1919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vsldoi "); 1920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvShlDbl.dst); 1921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvShlDbl.srcL); 1923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvShlDbl.srcR); 1925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",%d", i->Pin.AvShlDbl.shift); 1926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSplat: { 1929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.AvSplat.sz; 1930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar ch_sz = toUChar( (sz == 8) ? 'b' : (sz == 16) ? 'h' : 'w' ); 1931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vsplt%s%c ", 1932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSplat.src->tag == Pvi_Imm ? "is" : "", ch_sz); 1933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSplat.dst); 1934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCVI5s(i->Pin.AvSplat.src); 1936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvSplat.src->tag == Pvi_Reg) 1937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(", %d", (128/sz)-1); /* louis lane */ 1938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvCMov: 1942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("avcmov (%s) ", showPPCCondCode(i->Pin.AvCMov.cond)); 1943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvCMov.dst); 1944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvCMov.src); 1946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": "); 1947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (v_dst != v_src) { "); 1948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvCMov.cond.test != Pct_ALWAYS) { 1949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (%s) { ", showPPCCondCode(i->Pin.AvCMov.cond)); 1950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vmr "); 1952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvCMov.dst); 1953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvCMov.src); 1955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCMov.cond.test != Pct_ALWAYS) 1956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdVSCR: 1961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mtvscr "); 1962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvLdVSCR.src); 1963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Unary: 1966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.Dfp64Unary.op)); 1967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Unary.dst); 1968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Unary.src); 1970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Binary: 1973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.Dfp64Binary.op)); 1974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Binary.dst); 1975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Binary.srcL); 1977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Binary.srcR); 1979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift: 1982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpShift.op)); 1983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpShift.dst); 1984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpShift.src); 1986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpShift.shift); 1988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Unary: 1991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.Dfp128Unary.op)); 1992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Unary.dst_hi); 1993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Unary.src_hi); 1995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Binary: 1998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.Dfp128Binary.op)); 1999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Binary.dst_hi); 2000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Binary.srcR_hi); 2002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift128: 2005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpShift128.op)); 2006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpShift128.dst_hi); 2007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpShift128.src_hi); 2009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpShift128.shift); 2011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound: 2014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("drintx "); 2015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpRound.dst); 2016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpRound.src); 2018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpRound.r_rmc); /* R in bit 3 and RMC in bits 2:0 */ 2020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound128: 2023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("drintxq "); 2024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpRound128.dst_hi); 2025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpRound128.src_hi); 2027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpRound128.r_rmc); /* R in bit 3 and RMC in bits 2:0 */ 2029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize: 2032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpQuantize.op)); 2033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize.dst); 2034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize.srcL); 2036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize.srcR); 2038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpQuantize.rmc); 2040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize128: 2043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Dst is used to pass in left source and return result */ 2044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("dquaq "); 2045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize128.dst_hi); 2046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize128.dst_hi); 2048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize128.src_hi); 2050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpQuantize128.rmc); 2052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpD128toD64: 2055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpD128toD64.op)); 2056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpD128toD64.dst); 2057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpD128toD64.src_hi); 2059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpI64StoD128: 2063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpI64StoD128.op)); 2064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpI64StoD128.dst_hi); 2065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpI64StoD128.src); 2067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ExtractExpD128: 2070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("dxexq "); 2071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.ExtractExpD128.dst); 2072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.ExtractExpD128.src_hi); 2074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_InsertExpD128: 2076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("diexq "); 2077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.InsertExpD128.dst_hi); 2078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.InsertExpD128.srcL); 2080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.InsertExpD128.srcR_hi); 2082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Cmp: 2084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("dcmpo %%cr1,"); 2085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.srcL); 2086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.srcR); 2088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; mfcr "); 2089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.dst); 2090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; rlwinm "); 2091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.dst); 2092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.dst); 2094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(",8,28,31"); 2095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Cmp: 2097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("dcmpoq %%cr1,"); 2098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.srcL_hi); 2099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.srcR_hi); 2101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; mfcr "); 2102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.dst); 2103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; rlwinm "); 2104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.dst); 2105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.dst); 2107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(",8,28,31"); 2108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_EvCheck: 2110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Note that the counter dec is 32 bit even in 64-bit mode. */ 2111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(evCheck) "); 2112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("lwz r30,"); 2113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.EvCheck.amCounter); 2114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; addic. r30,r30,-1; "); 2115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("stw r30,"); 2116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.EvCheck.amCounter); 2117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; bge nofail; lwz r30,"); 2118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.EvCheck.amFailAddr); 2119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; mtctr r30; bctr; nofail:"); 2120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ProfInc: 2122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 2123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(profInc) imm64-fixed5 r30,$NotKnownYet; "); 2124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ld r29,(r30); addi r29,r29,1; std r29,(r30)"); 2125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(profInc) imm32-fixed2 r30,$NotKnownYet; "); 2127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("lwz r29,4(r30); addic. r29,r29,1; stw r29,4(r30)"); 2128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("lwz r29,0(r30); addze r29,r29; stw r29,0(r30)"); 2129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 2132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("\nppPPCInstr: No such tag(%d)\n", (Int)i->tag); 2133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("ppPPCInstr"); 2134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Helpers for register allocation. --------- */ 2138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid getRegUsage_PPCInstr ( HRegUsage* u, PPCInstr* i, Bool mode64 ) 2140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown initHRegUsage(u); 2142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->tag) { 2143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LI: 2144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.LI.dst); 2145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 2146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Alu: 2147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Alu.srcL); 2148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCRH(u, i->Pin.Alu.srcR); 2149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Alu.dst); 2150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Shft: 2152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Shft.srcL); 2153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCRH(u, i->Pin.Shft.srcR); 2154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Shft.dst); 2155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AddSubC: 2157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AddSubC.dst); 2158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AddSubC.srcL); 2159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AddSubC.srcR); 2160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Cmp: 2162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Cmp.srcL); 2163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCRH(u, i->Pin.Cmp.srcR); 2164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Unary: 2166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Unary.dst); 2167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Unary.src); 2168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MulL: 2170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.MulL.dst); 2171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.MulL.srcL); 2172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.MulL.srcR); 2173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Div: 2175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Div.dst); 2176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Div.srcL); 2177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Div.srcR); 2178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Call: { 2180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt argir; 2181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* This is a bit subtle. */ 2182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* First off, claim it trashes all the caller-saved regs 2183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown which fall within the register allocator's jurisdiction. 2184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown These I believe to be: 2185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mode32: r3 to r12 2186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mode64: r3 to r10 2187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 2188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* XXXXXXXXXXXXXXXXX BUG! This doesn't say anything about the FP 2189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown or Altivec registers. We get away with this ONLY because 2190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown getAllocatableRegs_PPC gives the allocator callee-saved fp 2191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and Altivec regs, and no caller-save ones. */ 2192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR3(mode64)); 2193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR4(mode64)); 2194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR5(mode64)); 2195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR6(mode64)); 2196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR7(mode64)); 2197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR8(mode64)); 2198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR9(mode64)); 2199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR10(mode64)); 2200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) { 2201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR11(mode64)); 2202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR12(mode64)); 2203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Now we have to state any parameter-carrying registers 2206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown which might be read. This depends on the argiregs field. */ 2207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown argir = i->Pin.Call.argiregs; 2208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir &(1<<10)) addHRegUse(u, HRmRead, hregPPC_GPR10(mode64)); 2209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<9)) addHRegUse(u, HRmRead, hregPPC_GPR9(mode64)); 2210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<8)) addHRegUse(u, HRmRead, hregPPC_GPR8(mode64)); 2211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<7)) addHRegUse(u, HRmRead, hregPPC_GPR7(mode64)); 2212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<6)) addHRegUse(u, HRmRead, hregPPC_GPR6(mode64)); 2213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<5)) addHRegUse(u, HRmRead, hregPPC_GPR5(mode64)); 2214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<4)) addHRegUse(u, HRmRead, hregPPC_GPR4(mode64)); 2215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<3)) addHRegUse(u, HRmRead, hregPPC_GPR3(mode64)); 2216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (argir & ~((1<<3)|(1<<4)|(1<<5)|(1<<6) 2218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown |(1<<7)|(1<<8)|(1<<9)|(1<<10)))); 2219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Finally, there is the issue that the insn trashes a 2221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown register because the literal target address has to be 2222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown loaded into a register. %r10 seems a suitable victim. 2223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Can't use %r0, as some insns interpret it as value zero). */ 2224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR10(mode64)); 2225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Upshot of this is that the assembler really must use %r10, 2226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and no other, as a destination temporary. */ 2227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* XDirect/XIndir/XAssisted are also a bit subtle. They 2230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng conditionally exit the block. Hence we only need to list (1) 2231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng the registers that they read, and (2) the registers that they 2232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng write in the case where the block is not exited. (2) is empty, 2233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng hence only (1) is relevant here. */ 2234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XDirect: 2235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.XDirect.amCIA); 2236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XIndir: 2238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.XIndir.dstGA); 2239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.XIndir.amCIA); 2240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XAssisted: 2242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.XAssisted.dstGA); 2243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.XAssisted.amCIA); 2244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_CMov: 2246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCRI(u, i->Pin.CMov.src); 2247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.CMov.dst); 2248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Load: 2250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCAMode(u, i->Pin.Load.src); 2251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Load.dst); 2252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LoadL: 2254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.LoadL.src); 2255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.LoadL.dst); 2256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Store: 2258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Store.src); 2259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCAMode(u, i->Pin.Store.dst); 2260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_StoreC: 2262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.StoreC.src); 2263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.StoreC.dst); 2264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Set: 2266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Set.dst); 2267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MfCR: 2269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.MfCR.dst); 2270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MFence: 2272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpUnary: 2275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpUnary.dst); 2276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpUnary.src); 2277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpBinary: 2279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpBinary.dst); 2280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpBinary.srcL); 2281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpBinary.srcR); 2282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpMulAcc: 2284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpMulAcc.dst); 2285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpMulAcc.srcML); 2286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpMulAcc.srcMR); 2287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpMulAcc.srcAcc); 2288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdSt: 2290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, (i->Pin.FpLdSt.isLoad ? HRmWrite : HRmRead), 2291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.reg); 2292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCAMode(u, i->Pin.FpLdSt.addr); 2293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpSTFIW: 2295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpSTFIW.addr); 2296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpSTFIW.data); 2297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpRSP: 2299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpRSP.dst); 2300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpRSP.src); 2301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCftI: 2303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpCftI.dst); 2304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpCftI.src); 2305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCMov: 2307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmModify, i->Pin.FpCMov.dst); 2308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpCMov.src); 2309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdFPSCR: 2311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpLdFPSCR.src); 2312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCmp: 2314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpCmp.dst); 2315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpCmp.srcL); 2316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpCmp.srcR); 2317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_RdWrLR: 2320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, (i->Pin.RdWrLR.wrLR ? HRmRead : HRmWrite), 2321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.RdWrLR.gpr); 2322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdSt: 2325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, (i->Pin.AvLdSt.isLoad ? HRmWrite : HRmRead), 2326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.reg); 2327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvLdSt.addr->tag == Pam_IR) 2328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64)); 2329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCAMode(u, i->Pin.AvLdSt.addr); 2330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUnary: 2332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvUnary.dst); 2333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvUnary.src); 2334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBinary: 2336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvBinary.op == Pav_XOR 2337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown && i->Pin.AvBinary.dst == i->Pin.AvBinary.srcL 2338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown && i->Pin.AvBinary.dst == i->Pin.AvBinary.srcR) { 2339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* reg-alloc needs to understand 'xor r,r,r' as a write of r */ 2340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* (as opposed to a rite of passage :-) */ 2341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBinary.dst); 2342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 2343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBinary.dst); 2344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBinary.srcL); 2345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBinary.srcR); 2346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin8x16: 2349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBin8x16.dst); 2350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin8x16.srcL); 2351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin8x16.srcR); 2352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin16x8: 2354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBin16x8.dst); 2355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin16x8.srcL); 2356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin16x8.srcR); 2357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32x4: 2359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBin32x4.dst); 2360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin32x4.srcL); 2361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin32x4.srcR); 2362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32Fx4: 2364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBin32Fx4.dst); 2365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin32Fx4.srcL); 2366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin32Fx4.srcR); 2367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvBin32Fx4.op == Pavfp_MULF) 2368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_VR29()); 2369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUn32Fx4: 2371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvUn32Fx4.dst); 2372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvUn32Fx4.src); 2373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvPerm: 2375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvPerm.dst); 2376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvPerm.srcL); 2377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvPerm.srcR); 2378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvPerm.ctl); 2379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSel: 2381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvSel.dst); 2382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvSel.ctl); 2383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvSel.srcL); 2384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvSel.srcR); 2385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvShlDbl: 2387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvShlDbl.dst); 2388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvShlDbl.srcL); 2389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvShlDbl.srcR); 2390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSplat: 2392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvSplat.dst); 2393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCVI5s(u, i->Pin.AvSplat.src); 2394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvCMov: 2396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmModify, i->Pin.AvCMov.dst); 2397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvCMov.src); 2398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdVSCR: 2400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvLdVSCR.src); 2401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Unary: 2403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp64Unary.dst); 2404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Unary.src); 2405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Binary: 2407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp64Binary.dst); 2408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Binary.srcL); 2409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Binary.srcR); 2410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift: 2412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCRI(u, i->Pin.DfpShift.shift); 2413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift.src); 2414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift.dst); 2415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Unary: 2417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Unary.dst_hi); 2418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Unary.dst_lo); 2419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Unary.src_hi); 2420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Unary.src_lo); 2421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Binary: 2423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Binary.dst_hi); 2424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Binary.dst_lo); 2425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Binary.srcR_hi); 2426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Binary.srcR_lo); 2427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound: 2429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpRound.dst); 2430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpRound.src); 2431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound128: 2433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpRound128.dst_hi); 2434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpRound128.dst_lo); 2435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpRound128.src_hi); 2436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpRound128.src_lo); 2437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize: 2439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCRI(u, i->Pin.DfpQuantize.rmc); 2440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpQuantize.dst); 2441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpQuantize.srcL); 2442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpQuantize.srcR); 2443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize128: 2445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpQuantize128.dst_hi); 2446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpQuantize128.dst_lo); 2447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpQuantize128.src_hi); 2448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpQuantize128.src_lo); 2449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift128: 2451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCRI(u, i->Pin.DfpShift128.shift); 2452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift128.src_hi); 2453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift128.src_lo); 2454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift128.dst_hi); 2455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift128.dst_lo); 2456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpD128toD64: 2458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.src_hi); 2459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.src_lo); 2460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.dst); 2461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpI64StoD128: 2463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.src); 2464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.dst_hi); 2465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.dst_lo); 2466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ExtractExpD128: 2468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.ExtractExpD128.dst); 2469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.ExtractExpD128.src_hi); 2470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.ExtractExpD128.src_lo); 2471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_InsertExpD128: 2473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.InsertExpD128.dst_hi); 2474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.InsertExpD128.dst_lo); 2475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.InsertExpD128.srcL); 2476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.InsertExpD128.srcR_hi); 2477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.InsertExpD128.srcR_lo); 2478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Cmp: 2480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp64Cmp.dst); 2481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Cmp.srcL); 2482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Cmp.srcR); 2483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Cmp: 2485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Cmp.dst); 2486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Cmp.srcL_hi); 2487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Cmp.srcL_lo); 2488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Cmp.srcR_hi); 2489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Cmp.srcR_lo); 2490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_EvCheck: 2492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We expect both amodes only to mention the GSP (r31), so this 2493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng is in fact pointless, since GSP isn't allocatable, but 2494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng anyway.. */ 2495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.EvCheck.amCounter); 2496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.EvCheck.amFailAddr); 2497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64)); /* also unavail to RA */ 2498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ProfInc: 2500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregPPC_GPR29(mode64)); 2501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64)); 2502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 2504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCInstr(i, mode64); 2505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("getRegUsage_PPCInstr"); 2506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* local helper */ 2510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapReg( HRegRemap* m, HReg* r ) 2511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *r = lookupHRegRemap(m, *r); 2513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid mapRegs_PPCInstr ( HRegRemap* m, PPCInstr* i, Bool mode64 ) 2516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->tag) { 2518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LI: 2519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.LI.dst); 2520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Alu: 2522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Alu.dst); 2523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Alu.srcL); 2524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCRH(m, i->Pin.Alu.srcR); 2525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Shft: 2527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Shft.dst); 2528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Shft.srcL); 2529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCRH(m, i->Pin.Shft.srcR); 2530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AddSubC: 2532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AddSubC.dst); 2533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AddSubC.srcL); 2534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AddSubC.srcR); 2535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Cmp: 2537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Cmp.srcL); 2538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCRH(m, i->Pin.Cmp.srcR); 2539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Unary: 2541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Unary.dst); 2542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Unary.src); 2543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MulL: 2545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.MulL.dst); 2546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.MulL.srcL); 2547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.MulL.srcR); 2548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Div: 2550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Div.dst); 2551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Div.srcL); 2552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Div.srcR); 2553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Call: 2555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XDirect: 2557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.XDirect.amCIA); 2558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XIndir: 2560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.XIndir.dstGA); 2561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.XIndir.amCIA); 2562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XAssisted: 2564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.XAssisted.dstGA); 2565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.XAssisted.amCIA); 2566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_CMov: 2568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCRI(m, i->Pin.CMov.src); 2569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.CMov.dst); 2570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Load: 2572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCAMode(m, i->Pin.Load.src); 2573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Load.dst); 2574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LoadL: 2576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.LoadL.src); 2577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.LoadL.dst); 2578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Store: 2580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Store.src); 2581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCAMode(m, i->Pin.Store.dst); 2582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_StoreC: 2584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.StoreC.src); 2585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.StoreC.dst); 2586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Set: 2588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Set.dst); 2589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MfCR: 2591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.MfCR.dst); 2592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MFence: 2594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpUnary: 2596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpUnary.dst); 2597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpUnary.src); 2598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpBinary: 2600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpBinary.dst); 2601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpBinary.srcL); 2602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpBinary.srcR); 2603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpMulAcc: 2605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpMulAcc.dst); 2606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpMulAcc.srcML); 2607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpMulAcc.srcMR); 2608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpMulAcc.srcAcc); 2609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdSt: 2611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpLdSt.reg); 2612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCAMode(m, i->Pin.FpLdSt.addr); 2613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpSTFIW: 2615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpSTFIW.addr); 2616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpSTFIW.data); 2617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpRSP: 2619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpRSP.dst); 2620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpRSP.src); 2621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCftI: 2623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCftI.dst); 2624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCftI.src); 2625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCMov: 2627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCMov.dst); 2628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCMov.src); 2629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdFPSCR: 2631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpLdFPSCR.src); 2632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCmp: 2634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCmp.dst); 2635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCmp.srcL); 2636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCmp.srcR); 2637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_RdWrLR: 2639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.RdWrLR.gpr); 2640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdSt: 2642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvLdSt.reg); 2643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCAMode(m, i->Pin.AvLdSt.addr); 2644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUnary: 2646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvUnary.dst); 2647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvUnary.src); 2648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBinary: 2650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBinary.dst); 2651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBinary.srcL); 2652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBinary.srcR); 2653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin8x16: 2655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin8x16.dst); 2656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin8x16.srcL); 2657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin8x16.srcR); 2658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin16x8: 2660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin16x8.dst); 2661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin16x8.srcL); 2662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin16x8.srcR); 2663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32x4: 2665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32x4.dst); 2666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32x4.srcL); 2667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32x4.srcR); 2668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32Fx4: 2670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32Fx4.dst); 2671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32Fx4.srcL); 2672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32Fx4.srcR); 2673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUn32Fx4: 2675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvUn32Fx4.dst); 2676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvUn32Fx4.src); 2677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvPerm: 2679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvPerm.dst); 2680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvPerm.srcL); 2681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvPerm.srcR); 2682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvPerm.ctl); 2683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSel: 2685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSel.dst); 2686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSel.srcL); 2687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSel.srcR); 2688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSel.ctl); 2689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvShlDbl: 2691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvShlDbl.dst); 2692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvShlDbl.srcL); 2693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvShlDbl.srcR); 2694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSplat: 2696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSplat.dst); 2697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCVI5s(m, i->Pin.AvSplat.src); 2698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvCMov: 2700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvCMov.dst); 2701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvCMov.src); 2702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdVSCR: 2704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvLdVSCR.src); 2705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Unary: 2707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Unary.dst); 2708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Unary.src); 2709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Binary: 2711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Binary.dst); 2712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Binary.srcL); 2713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Binary.srcR); 2714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift: 2716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCRI(m, i->Pin.DfpShift.shift); 2717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift.src); 2718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift.dst); 2719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Unary: 2721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Unary.dst_hi); 2722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Unary.dst_lo); 2723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Unary.src_hi); 2724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Unary.src_lo); 2725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Binary: 2727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Binary.dst_hi); 2728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Binary.dst_lo); 2729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Binary.srcR_hi); 2730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Binary.srcR_lo); 2731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift128: 2733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCRI(m, i->Pin.DfpShift128.shift); 2734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift128.src_hi); 2735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift128.src_lo); 2736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift128.dst_hi); 2737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift128.dst_lo); 2738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound: 2740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound.dst); 2741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound.src); 2742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound128: 2744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound128.dst_hi); 2745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound128.dst_lo); 2746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound128.src_hi); 2747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound128.src_lo); 2748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize: 2750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCRI(m, i->Pin.DfpQuantize.rmc); 2751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize.dst); 2752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize.srcL); 2753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize.srcR); 2754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize128: 2756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCRI(m, i->Pin.DfpQuantize128.rmc); 2757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize128.dst_hi); 2758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize128.dst_lo); 2759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize128.src_hi); 2760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize128.src_lo); 2761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpD128toD64: 2763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpD128toD64.src_hi); 2764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpD128toD64.src_lo); 2765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpD128toD64.dst); 2766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpI64StoD128: 2768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpI64StoD128.src); 2769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpI64StoD128.dst_hi); 2770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpI64StoD128.dst_lo); 2771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ExtractExpD128: 2773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.ExtractExpD128.dst); 2774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.ExtractExpD128.src_hi); 2775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.ExtractExpD128.src_lo); 2776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_InsertExpD128: 2778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.dst_hi); 2779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.dst_lo); 2780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.srcL); 2781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.srcR_hi); 2782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.srcR_lo); 2783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Cmp: 2785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Cmp.dst); 2786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Cmp.srcL); 2787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Cmp.srcR); 2788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Cmp: 2790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.dst); 2791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.srcL_hi); 2792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.srcL_lo); 2793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.srcR_hi); 2794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.srcR_lo); 2795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_EvCheck: 2797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We expect both amodes only to mention the GSP (r31), so this 2798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng is in fact pointless, since GSP isn't allocatable, but 2799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng anyway.. */ 2800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.EvCheck.amCounter); 2801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.EvCheck.amFailAddr); 2802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ProfInc: 2804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* hardwires r29 and r30 -- nothing to modify. */ 2805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 2807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCInstr(i, mode64); 2808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("mapRegs_PPCInstr"); 2809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Figure out if i represents a reg-reg move, and if so assign the 2813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown source and destination to *src and *dst. If in doubt say No. Used 2814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown by the register allocator to do move coalescing. 2815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 2816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool isMove_PPCInstr ( PPCInstr* i, HReg* src, HReg* dst ) 2817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Moves between integer regs */ 2819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->tag == Pin_Alu) { 2820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // or Rd,Rs,Rs == mr Rd,Rs 2821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Alu.op != Palu_OR) 2822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 2823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Alu.srcR->tag != Prh_Reg) 2824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 2825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Alu.srcR->Prh.Reg.reg != i->Pin.Alu.srcL) 2826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 2827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *src = i->Pin.Alu.srcL; 2828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *dst = i->Pin.Alu.dst; 2829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return True; 2830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Moves between FP regs */ 2832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->tag == Pin_FpUnary) { 2833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpUnary.op != Pfp_MOV) 2834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 2835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *src = i->Pin.FpUnary.src; 2836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *dst = i->Pin.FpUnary.dst; 2837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return True; 2838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 2840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Generate ppc spill/reload instructions under the direction of the 2844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown register allocator. Note it's critical these don't write the 2845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown condition codes. */ 2846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid genSpill_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 2848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg rreg, Int offsetB, Bool mode64 ) 2849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am; 2851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(rreg)); 2852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = *i2 = NULL; 2853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am = PPCAMode_IR( offsetB, GuestStatePtr(mode64) ); 2854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (hregClass(rreg)) { 2855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt64: 2856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 2857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_Store( 8, am, rreg, mode64 ); 2858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt32: 2860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!mode64); 2861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_Store( 4, am, rreg, mode64 ); 2862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcFlt64: 2864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_FpLdSt ( False/*store*/, 8, rreg, am ); 2865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcVec128: 2867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: GPR30 used as spill register to kludge AltiVec 2868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // AMode_IR 2869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_AvLdSt ( False/*store*/, 16, rreg, am ); 2870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 2872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegClass(hregClass(rreg)); 2873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("genSpill_PPC: unimplemented regclass"); 2874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 2878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg rreg, Int offsetB, Bool mode64 ) 2879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am; 2881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(rreg)); 2882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = *i2 = NULL; 2883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am = PPCAMode_IR( offsetB, GuestStatePtr(mode64) ); 2884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (hregClass(rreg)) { 2885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt64: 2886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 2887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_Load( 8, rreg, am, mode64 ); 2888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt32: 2890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!mode64); 2891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_Load( 4, rreg, am, mode64 ); 2892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcFlt64: 2894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_FpLdSt ( True/*load*/, 8, rreg, am ); 2895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcVec128: 2897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: GPR30 used as spill register to kludge AltiVec AMode_IR 2898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_AvLdSt ( True/*load*/, 16, rreg, am ); 2899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 2901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegClass(hregClass(rreg)); 2902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("genReload_PPC: unimplemented regclass"); 2903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- The ppc assembler (bleh.) --------- */ 2908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt iregNo ( HReg r, Bool mode64 ) 2910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n; 2912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(hregClass(r) == mode64 ? HRcInt64 : HRcInt32); 2913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(r)); 2914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown n = hregNumber(r); 2915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n <= 32); 2916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return n; 2917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt fregNo ( HReg fr ) 2920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n; 2922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(hregClass(fr) == HRcFlt64); 2923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(fr)); 2924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown n = hregNumber(fr); 2925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n <= 32); 2926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return n; 2927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt vregNo ( HReg v ) 2930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n; 2932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(hregClass(v) == HRcVec128); 2933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(v)); 2934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown n = hregNumber(v); 2935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n <= 32); 2936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return n; 2937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Emit an instruction big-endianly */ 2940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* emit32 ( UChar* p, UInt w32 ) 2941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *p++ = toUChar((w32 >> 24) & 0x000000FF); 2943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *p++ = toUChar((w32 >> 16) & 0x000000FF); 2944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *p++ = toUChar((w32 >> 8) & 0x000000FF); 2945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *p++ = toUChar((w32) & 0x000000FF); 2946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 2947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Fetch an instruction big-endianly */ 2950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt fetch32 ( UChar* p ) 2951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt w32 = 0; 2953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[0]) << 24); 2954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[1]) << 16); 2955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[2]) << 8); 2956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[3]) << 0); 2957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return w32; 2958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The following mkForm[...] functions refer to ppc instruction forms 2961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown as per PPC32 p576 2962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 2963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormD ( UChar* p, UInt opc1, 2965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r1, UInt r2, UInt imm ) 2966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 2968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 2969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 2970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 2971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm = imm & 0xFFFF; 2972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (imm)); 2973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 2974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormMD ( UChar* p, UInt opc1, UInt r1, UInt r2, 2977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt imm1, UInt imm2, UInt opc2 ) 2978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 2980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 2981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 2982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 2983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(imm1 < 0x40); 2984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(imm2 < 0x40); 2985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x08); 2986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm2 = ((imm2 & 0x1F) << 1) | (imm2 >> 5); 2987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 2988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ((imm1 & 0x1F)<<11) | (imm2<<5) | 2989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (opc2<<2) | ((imm1 >> 5)<<1)); 2990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 2991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormX ( UChar* p, UInt opc1, UInt r1, UInt r2, 2994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt opc2, UInt b0 ) 2995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 2997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 2998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 2999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2); 3003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r3<<11) | (opc2<<1) | (b0)); 3005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXO ( UChar* p, UInt opc1, UInt r1, UInt r2, 3009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt b10, UInt opc2, UInt b0 ) 3010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b10 < 0x2); 3017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x200); 3018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2); 3019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r3<<11) | (b10 << 10) | (opc2<<1) | (b0)); 3021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXL ( UChar* p, UInt opc1, UInt f1, UInt f2, 3025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt f3, UInt opc2, UInt b0 ) 3026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f1 < 0x20); 3030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f2 < 0x20); 3031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f3 < 0x20); 3032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2); 3034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (f1<<21) | (f2<<16) | 3035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (f3<<11) | (opc2<<1) | (b0)); 3036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Note: for split field ops, give mnemonic arg 3040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXFX ( UChar* p, UInt r1, UInt f2, UInt opc2 ) 3041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f2 < 0x20); 3045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (opc2) { 3047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 144: // mtcrf 3048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f2 < 0x100); 3049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown f2 = f2 << 1; 3050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 339: // mfspr 3052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 371: // mftb 3053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 467: // mtspr 3054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f2 < 0x400); 3055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // re-arrange split field 3056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown f2 = ((f2>>5) & 0x1F) | ((f2 & 0x1F)<<5); 3057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("mkFormXFX(ppch)"); 3059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((31<<26) | (r1<<21) | (f2<<11) | (opc2<<1)); 3061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Only used by mtfsf 3065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormXFL ( UChar* p, UInt FM, UInt freg, UInt dfp_rm ) 3066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(FM < 0x100); 3069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(freg < 0x20); 3070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((63<<26) | (FM<<17) | (dfp_rm<<16) | (freg<<11) | (711<<1)); 3071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXS ( UChar* p, UInt opc1, UInt r1, UInt r2, 3075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt imm, UInt opc2, UInt b0 ) 3076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(imm < 0x40); 3082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2); 3084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ((imm & 0x1F)<<11) | (opc2<<2) | ((imm>>5)<<1) | (b0)); 3086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0 3091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'b' 3092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormI ( UChar* p, UInt LI, UInt AA, UInt LK ) 3093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(LI < 0x1000000); 3096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(AA < 0x2); 3097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(LK < 0x2); 3098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((18<<26) | (LI<<2) | (AA<<1) | (LK)); 3099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 3102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'bc' 3104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormB ( UChar* p, UInt BO, UInt BI, 3105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt BD, UInt AA, UInt LK ) 3106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(BO < 0x20); 3109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(BI < 0x20); 3110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(BD < 0x4000); 3111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(AA < 0x2); 3112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(LK < 0x2); 3113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((16<<26) | (BO<<21) | (BI<<16) | 3114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (BD<<2) | (AA<<1) | (LK)); 3115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// rotates 3119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormM ( UChar* p, UInt opc1, UInt r1, UInt r2, 3120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt f3, UInt MB, UInt ME, UInt Rc ) 3121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f3 < 0x20); 3127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(MB < 0x20); 3128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(ME < 0x20); 3129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(Rc < 0x2); 3130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (f3<<11) | (MB<<6) | (ME<<1) | (Rc)); 3132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormA ( UChar* p, UInt opc1, UInt r1, UInt r2, 3136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt r4, UInt opc2, UInt b0 ) 3137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r4 < 0x20); 3144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x20); 3145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2 ); 3146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (r3<<11) | 3147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r4<<6) | (opc2<<1) | (b0)); 3148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormZ22 ( UChar* p, UInt opc1, UInt r1, UInt r2, 3152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt constant, UInt opc2, UInt b0 ) 3153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 3155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc1 < 0x40); 3156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r1 < 0x20); 3157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r2 < 0x20); 3158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(constant < 0x40); /* 6 bit constant */ 3159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc2 < 0x200); /* 9 bit field */ 3160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(b0 < 0x2); 3161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (constant<<10) | (opc2<<1) | (b0)); 3163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 3164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormZ23 ( UChar* p, UInt opc1, UInt r1, UInt r2, 3167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r3, UInt rmc, UInt opc2, UInt b0 ) 3168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 3170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc1 < 0x40); 3171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r1 < 0x20); 3172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r2 < 0x20); 3173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r3 < 0x20); 3174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rmc < 0x4); 3175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc2 < 0x100); 3176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(b0 < 0x2); 3177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (r3<<11) | (rmc<<9) | (opc2<<1) | (b0)); 3179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 3180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* doAMode_IR ( UChar* p, UInt opc1, UInt rSD, 3183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am, Bool mode64 ) 3184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt rA, idx; 3186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(am->tag == Pam_IR); 3187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(am->Pam.IR.index < 0x10000); 3188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rA = iregNo(am->Pam.IR.base, mode64); 3190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown idx = am->Pam.IR.index; 3191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (opc1 == 58 || opc1 == 62) { // ld/std: mode64 only 3193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 3194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* stay sane with DS form: lowest 2 bits must be 00. This 3195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown should be guaranteed to us by iselWordExpr_AMode. */ 3196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (idx & 3)); 3197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, opc1, rSD, rA, idx); 3199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 3200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* doAMode_RR ( UChar* p, UInt opc1, UInt opc2, 3203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt rSD, PPCAMode* am, Bool mode64 ) 3204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt rA, rB; 3206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(am->tag == Pam_RR); 3207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rA = iregNo(am->Pam.RR.base, mode64); 3209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rB = iregNo(am->Pam.RR.index, mode64); 3210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, opc1, rSD, rA, rB, opc2, 0); 3212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 3213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Load imm to r_dst */ 3217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkLoadImm ( UChar* p, UInt r_dst, ULong imm, Bool mode64 ) 3218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r_dst < 0x20); 3220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) { 3222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* In 32-bit mode, make sure the top 32 bits of imm are a sign 3223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown extension of the bottom 32 bits, so that the range tests 3224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown below work correctly. */ 3225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt u32 = (UInt)imm; 3226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int s32 = (Int)u32; 3227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long s64 = (Long)s32; 3228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm = (ULong)s64; 3229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (imm >= 0xFFFFFFFFFFFF8000ULL || imm < 0x8000) { 3232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // sign-extendable from 16 bits 3233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // addi r_dst,0,imm => li r_dst,imm 3235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 14, r_dst, 0, imm & 0xFFFF); 3236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (imm >= 0xFFFFFFFF80000000ULL || imm < 0x80000000ULL) { 3238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // sign-extendable from 32 bits 3239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16) 3241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF); 3242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // ori r_dst, r_dst, (imm & 0xFFFF) 3243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // full 64bit immediate load: 5 (five!) insns. 3246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 3247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // load high word 3249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // lis r_dst, (imm>>48) & 0xFFFF 3251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF); 3252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // ori r_dst, r_dst, (imm>>32) & 0xFFFF 3254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((imm>>32) & 0xFFFF) 3255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF); 3256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // shift r_dst low word to high word => rldicr 3258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1); 3259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // load low word 3261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // oris r_dst, r_dst, (imm>>16) & 0xFFFF 3263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((imm>>16) & 0xFFFF) 3264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF); 3265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // ori r_dst, r_dst, (imm) & 0xFFFF 3267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (imm & 0xFFFF) 3268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 3272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A simplified version of mkLoadImm that always generates 2 or 5 3275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instructions (32 or 64 bits respectively) even if it could generate 3276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fewer. This is needed for generating fixed sized patchable 3277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sequences. */ 3278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkLoadImm_EXACTLY2or5 ( UChar* p, 3279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst, ULong imm, Bool mode64 ) 3280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 3282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 3284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* In 32-bit mode, make sure the top 32 bits of imm are a sign 3285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng extension of the bottom 32 bits. (Probably unnecessary.) */ 3286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt)imm; 3287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int)u32; 3288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long)s32; 3289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong)s64; 3290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 3293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16) 3294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF); 3295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm & 0xFFFF) 3296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // full 64bit immediate load: 5 (five!) insns. 3300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // load high word 3302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lis r_dst, (imm>>48) & 0xFFFF 3303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF); 3304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm>>32) & 0xFFFF 3306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF); 3307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // shift r_dst low word to high word => rldicr 3309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1); 3310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // load low word 3312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // oris r_dst, r_dst, (imm>>16) & 0xFFFF 3313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF); 3314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm) & 0xFFFF 3316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 3319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Checks whether the sequence of bytes at p was indeed created 3322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng by mkLoadImm_EXACTLY2or5 with the given parameters. */ 3323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool isLoadImm_EXACTLY2or5 ( UChar* p_to_check, 3324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst, ULong imm, Bool mode64 ) 3325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 3327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 3329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* In 32-bit mode, make sure the top 32 bits of imm are a sign 3330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng extension of the bottom 32 bits. (Probably unnecessary.) */ 3331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt)imm; 3332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int)u32; 3333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long)s32; 3334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong)s64; 3335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 3338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt expect[2] = { 0, 0 }; 3339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)&expect[0]; 3340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16) 3341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF); 3342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm & 0xFFFF) 3343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(p == (UChar*)&expect[2]); 3345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return fetch32(p_to_check + 0) == expect[0] 3347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 4) == expect[1]; 3348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt expect[5] = { 0, 0, 0, 0, 0 }; 3351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)&expect[0]; 3352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // full 64bit immediate load: 5 (five!) insns. 3353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // load high word 3355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lis r_dst, (imm>>48) & 0xFFFF 3356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF); 3357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm>>32) & 0xFFFF 3359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF); 3360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // shift r_dst low word to high word => rldicr 3362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1); 3363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // load low word 3365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // oris r_dst, r_dst, (imm>>16) & 0xFFFF 3366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF); 3367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm) & 0xFFFF 3369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(p == (UChar*)&expect[5]); 3372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return fetch32(p_to_check + 0) == expect[0] 3374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 4) == expect[1] 3375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 8) == expect[2] 3376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 12) == expect[3] 3377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 16) == expect[4]; 3378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a machine-word sized load or store. Simplified version of 3383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng the Pin_Load and Pin_Store cases below. */ 3384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* do_load_or_store_machine_word ( 3385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p, Bool isLoad, 3386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt reg, PPCAMode* am, Bool mode64 ) 3387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (isLoad) { 3389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1, sz = mode64 ? 8 : 4; 3390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 3391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_IR: 3392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Pam.IR.index & 3)); 3394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: opc1 = 32; vassert(!mode64); break; 3397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: opc1 = 58; vassert(mode64); break; 3398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: vassert(0); 3399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 3401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_RR: 3403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 3404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 3405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else /*store*/ { 3410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1, sz = mode64 ? 8 : 4; 3411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 3412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_IR: 3413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Pam.IR.index & 3)); 3415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: opc1 = 36; vassert(!mode64); break; 3418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: opc1 = 62; vassert(mode64); break; 3419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: vassert(0); 3420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 3422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_RR: 3424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 3425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 3426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 3432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a 32-bit sized load or store. Simplified version of 3435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_load_or_store_machine_word above. */ 3436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* do_load_or_store_word32 ( 3437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p, Bool isLoad, 3438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt reg, PPCAMode* am, Bool mode64 ) 3439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (isLoad) { 3441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1; 3442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 3443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_IR: 3444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Pam.IR.index & 3)); 3446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 32; 3448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 3449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_RR: 3451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 3452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 3453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else /*store*/ { 3458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1; 3459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 3460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_IR: 3461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Pam.IR.index & 3)); 3463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 36; 3465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 3466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_RR: 3468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 3469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 3470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 3476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Move r_dst to r_src */ 3479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkMoveReg ( UChar* p, UInt r_dst, UInt r_src ) 3480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r_dst < 0x20); 3482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r_src < 0x20); 3483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (r_dst != r_src) { 3485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* or r_dst, r_src, r_src */ 3486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, r_src, 444, 0 ); 3487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 3489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVX ( UChar* p, UInt opc1, UInt r1, UInt r2, 3492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt opc2 ) 3493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x800); 3500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (r3<<11) | opc2); 3501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVXR ( UChar* p, UInt opc1, UInt r1, UInt r2, 3505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt Rc, UInt opc2 ) 3506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(Rc < 0x2); 3513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r3<<11) | (Rc<<10) | opc2); 3516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVA ( UChar* p, UInt opc1, UInt r1, UInt r2, 3520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt r4, UInt opc2 ) 3521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r4 < 0x20); 3528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x40); 3529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r3<<11) | (r4<<6) | opc2); 3531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Emit an instruction into buf and return the number of bytes used. 3537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Note that buf is not the insn's final place, and therefore it is 3538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imperative to emit position-independent code. If the emitted 3539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instruction was a profiler inc, set *is_profInc to True, else leave 3540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng it unchanged. 3541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 3542663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt emit_PPCInstr ( /*MB_MOD*/Bool* is_profInc, 3543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* buf, Int nbuf, PPCInstr* i, 3544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool mode64, 3545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_slowEP, 3546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_fastEP, 3547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xindir, 3548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xassisted ) 3549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar* p = &buf[0]; 3551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(nbuf >= 32); 3552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (0) { 3554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("asm ");ppPPCInstr(i, mode64); vex_printf("\n"); 3555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->tag) { 3558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LI: 3560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkLoadImm(p, iregNo(i->Pin.LI.dst, mode64), 3561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LI.imm64, mode64); 3562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Alu: { 3565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR = i->Pin.Alu.srcR; 3566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool immR = toBool(srcR->tag == Prh_Imm); 3567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Alu.dst, mode64); 3568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.Alu.srcL, mode64); 3569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = immR ? (-1)/*bogus*/ : 3570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown iregNo(srcR->Prh.Reg.reg, mode64); 3571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.Alu.op) { 3573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_ADD: 3574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* addi (PPC32 p350) */ 3576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(srcR->Prh.Imm.syned); 3577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(srcR->Prh.Imm.imm16 != 0x8000); 3578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 14, r_dst, r_srcL, srcR->Prh.Imm.imm16); 3579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* add (PPC32 p347) */ 3581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 266, 0); 3582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_SUB: 3586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* addi (PPC32 p350), but with negated imm */ 3588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(srcR->Prh.Imm.syned); 3589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(srcR->Prh.Imm.imm16 != 0x8000); 3590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 14, r_dst, r_srcL, (- srcR->Prh.Imm.imm16)); 3591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* subf (PPC32 p537), with args the "wrong" way round */ 3593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 40, 0); 3594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_AND: 3598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* andi. (PPC32 p358) */ 3600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 28, r_srcL, r_dst, srcR->Prh.Imm.imm16); 3602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* and (PPC32 p356) */ 3604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 28, 0); 3605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_OR: 3609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* ori (PPC32 p497) */ 3611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 24, r_srcL, r_dst, srcR->Prh.Imm.imm16); 3613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* or (PPC32 p495) */ 3615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 444, 0); 3616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_XOR: 3620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* xori (PPC32 p550) */ 3622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 26, r_srcL, r_dst, srcR->Prh.Imm.imm16); 3624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* xor (PPC32 p549) */ 3626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 316, 0); 3627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 3631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 3632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Shft: { 3637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR = i->Pin.Shft.srcR; 3638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32 = i->Pin.Shft.sz32; 3639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool immR = toBool(srcR->tag == Prh_Imm); 3640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Shft.dst, mode64); 3641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.Shft.srcL, mode64); 3642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = immR ? (-1)/*bogus*/ : 3643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown iregNo(srcR->Prh.Reg.reg, mode64); 3644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) 3645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz32); 3646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.Shft.op) { 3648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pshft_SHL: 3649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) { 3650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* rd = rs << n, 1 <= n <= 31 3652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is 3653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rlwinm rd,rs,n,0,31-n (PPC32 p501) 3654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 3655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 32); 3658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormM(p, 21, r_srcL, r_dst, n, 0, 31-n, 0); 3659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* slw (PPC32 p505) */ 3661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 24, 0); 3662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* rd = rs << n, 1 <= n <= 63 3666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is 3667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rldicr rd,rs,n,63-n (PPC64 p559) 3668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 3669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 64); 3672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormMD(p, 30, r_srcL, r_dst, n, 63-n, 1); 3673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* sld (PPC64 p568) */ 3675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 27, 0); 3676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pshft_SHR: 3681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) { 3682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* rd = rs >>u n, 1 <= n <= 31 3684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is 3685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rlwinm rd,rs,32-n,n,31 (PPC32 p501) 3686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 3687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 32); 3690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormM(p, 21, r_srcL, r_dst, 32-n, n, 31, 0); 3691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* srw (PPC32 p508) */ 3693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 536, 0); 3694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* rd = rs >>u n, 1 <= n <= 63 3698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is 3699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rldicl rd,rs,64-n,n (PPC64 p558) 3700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 3701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 64); 3704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormMD(p, 30, r_srcL, r_dst, 64-n, n, 0); 3705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* srd (PPC64 p574) */ 3707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 539, 0); 3708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pshft_SAR: 3713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) { 3714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* srawi (PPC32 p507) */ 3716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* In 64-bit mode, we allow right shifts by zero bits 3719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown as that is a handy way to sign extend the lower 32 3720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bits into the upper 32 bits. */ 3721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mode64) 3722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n >= 0 && n < 32); 3723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 3724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 32); 3725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, n, 824, 0); 3726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* sraw (PPC32 p506) */ 3728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 792, 0); 3729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* sradi (PPC64 p571) */ 3733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 64); 3736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXS(p, 31, r_srcL, r_dst, n, 413, 0); 3737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* srad (PPC32 p570) */ 3739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 794, 0); 3740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 3745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 3746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AddSubC: { 3751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool isAdd = i->Pin.AddSubC.isAdd; 3752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool setC = i->Pin.AddSubC.setC; 3753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.AddSubC.srcL, mode64); 3754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = iregNo(i->Pin.AddSubC.srcR, mode64); 3755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.AddSubC.dst, mode64); 3756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (isAdd) { 3758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (setC) /* addc (PPC32 p348) */ 3759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 10, 0); 3760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else /* adde (PPC32 p349) */ 3761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 138, 0); 3762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* subfX, with args the "wrong" way round */ 3764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (setC) /* subfc (PPC32 p538) */ 3765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 8, 0); 3766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else /* subfe (PPC32 p539) */ 3767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 136, 0); 3768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Cmp: { 3773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned = i->Pin.Cmp.syned; 3774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32 = i->Pin.Cmp.sz32; 3775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fld1 = i->Pin.Cmp.crfD << 2; 3776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.Cmp.srcL, mode64); 3777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR, imm_srcR; 3778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR = i->Pin.Cmp.srcR; 3779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) // cmp double word invalid for mode32 3781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz32); 3782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else if (!sz32) // mode64 && cmp64: set L=1 3783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fld1 |= 1; 3784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (srcR->tag) { 3786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Imm: 3787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(syned == srcR->Prh.Imm.syned); 3788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm_srcR = srcR->Prh.Imm.imm16; 3789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) { // cmpw/di (signed) (PPC32 p368) 3790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(imm_srcR != 0x8000); 3791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 11, fld1, r_srcL, imm_srcR); 3792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // cmplw/di (unsigned) (PPC32 p370) 3793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 10, fld1, r_srcL, imm_srcR); 3794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Reg: 3797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_srcR = iregNo(srcR->Prh.Reg.reg, mode64); 3798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // cmpwi (signed) (PPC32 p367) 3799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, fld1, r_srcL, r_srcR, 0, 0); 3800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // cmplwi (unsigned) (PPC32 p379) 3801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, fld1, r_srcL, r_srcR, 32, 0); 3802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 3804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 3805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Unary: { 3810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Unary.dst, mode64); 3811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_src = iregNo(i->Pin.Unary.src, mode64); 3812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.Unary.op) { 3814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_NOT: // nor r_dst,r_src,r_src 3815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, r_src, 124, 0); 3816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_NEG: // neg r_dst,r_src 3818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_src, 0, 0, 104, 0); 3819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_CLZ32: // cntlzw r_dst, r_src 3821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, 0, 26, 0); 3822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_CLZ64: // cntlzd r_dst, r_src 3824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 3825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, 0, 58, 0); 3826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_EXTSW: // extsw r_dst, r_src 3828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 3829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, 0, 986, 0); 3830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: goto bad; 3832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MulL: { 3837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned = i->Pin.MulL.syned; 3838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32 = i->Pin.MulL.sz32; 3839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.MulL.dst, mode64); 3840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.MulL.srcL, mode64); 3841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = iregNo(i->Pin.MulL.srcR, mode64); 3842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) 3844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz32); 3845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.MulL.hi) { 3847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // mul hi words, must consider sign 3848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) { 3849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // mulhw r_dst,r_srcL,r_srcR 3850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 75, 0); 3851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // mulhwu r_dst,r_srcL,r_srcR 3852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 11, 0); 3853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // mulhd r_dst,r_srcL,r_srcR 3855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 73, 0); 3856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // mulhdu r_dst,r_srcL,r_srcR 3857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 9, 0); 3858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // mul low word, sign is irrelevant 3861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!i->Pin.MulL.syned); 3862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) // mullw r_dst,r_srcL,r_srcR 3863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 235, 0); 3864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // mulld r_dst,r_srcL,r_srcR 3865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 233, 0); 3866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Div: { 3871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned = i->Pin.Div.syned; 3872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32 = i->Pin.Div.sz32; 3873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Div.dst, mode64); 3874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.Div.srcL, mode64); 3875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = iregNo(i->Pin.Div.srcR, mode64); 3876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) 3878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz32); 3879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.Div.extended) { 3881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sz32) { 3882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (syned) 3883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // divwe r_dst,r_srcL,r_srcR 3884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 427, 0); 3885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 3886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // divweu r_dst,r_srcL,r_srcR 3887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 395, 0); 3888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 3889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (syned) 3890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // divde r_dst,r_srcL,r_srcR 3891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 425, 0); 3892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 3893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // divdeu r_dst,r_srcL,r_srcR 3894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 393, 0); 3895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 3896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else if (sz32) { 3897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // divw r_dst,r_srcL,r_srcR 3898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 491, 0); 3899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // divwu r_dst,r_srcL,r_srcR 3900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 459, 0); 3901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // divd r_dst,r_srcL,r_srcR 3903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 489, 0); 3904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // divdu r_dst,r_srcL,r_srcR 3905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 457, 0); 3906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Call: { 3911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond = i->Pin.Call.cond; 3912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = 10; 3913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* As per detailed comment for Pin_Call in 3914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown getRegUsage_PPCInstr above, %r10 is used as an address temp */ 3915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* jump over the following insns if condition does not hold */ 3917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 3918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test != Pct_ALWAYS) { 3919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* jmp fwds if !condition */ 3920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* don't know how many bytes to jump over yet... 3921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown make space for a jump instruction and fill in later. */ 3922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ptmp = p; /* fill in this bit later */ 3923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p += 4; // p += 4 3924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* load target to r_dst */ // p += 4|8|20 3927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkLoadImm(p, r_dst, i->Pin.Call.target, mode64); 3928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* mtspr 9,r_dst => move r_dst to count register */ 3930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXFX(p, r_dst, 9, 467); // p += 4 3931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bctrl => branch to count register (and save to lr) */ 3933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 1); // p += 4 3934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Fix up the conditional jump, if there was one. */ 3936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test != Pct_ALWAYS) { 3937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int delta = p - ptmp; 3938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(delta >= 16 && delta <= 32); 3939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,delta */ 3940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mkFormB(ptmp, invertCondTest(cond.test), 3941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cond.flag, (delta>>2), 0, 0); 3942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XDirect: { 3947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* NB: what goes on here has to be very closely coordinated 3948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng with the chainXDirect_PPC and unchainXDirect_PPC below. */ 3949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We're generating chain-me requests here, so we need to be 3950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sure this is actually allowed -- no-redir translations 3951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng can't use chain-me's. Hence: */ 3952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_chain_me_to_slowEP != NULL); 3953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_chain_me_to_fastEP != NULL); 3954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional jump 3956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng over the rest of it. Or at least, leave a space for it that 3957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we will shortly fill in. */ 3958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 3959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XDirect.cond.test != Pct_ALWAYS) { 3960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XDirect.cond.flag != Pcf_NONE); 3961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 3962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p += 4; 3963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XDirect.cond.flag == Pcf_NONE); 3965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest CIA. */ 3968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r30, dstGA */ 3969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) vassert(0 == (((ULong)i->Pin.XDirect.dstGA) >> 32)); 3970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, /*r*/30, (ULong)i->Pin.XDirect.dstGA, mode64); 3971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* stw/std r30, amCIA */ 3972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word( 3973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, False/*!isLoad*/, 3974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /*r*/30, i->Pin.XDirect.amCIA, mode64 3975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ); 3976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* --- FIRST PATCHABLE BYTE follows --- */ 3978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* VG_(disp_cp_chain_me_to_{slowEP,fastEP}) (where we're calling 3979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng to) backs up the return address, so as to find the address of 3980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng the first patchable byte. So: don't change the number of 3981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instructions (32-bit: 4, 64-bit: 7) below. */ 3982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64-fixed r30, VG_(disp_cp_chain_me_to_{slowEP,fastEP} */ 3983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me 3984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng = i->Pin.XDirect.toFastEP ? disp_cp_chain_me_to_fastEP 3985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : disp_cp_chain_me_to_slowEP; 3986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5( 3987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, /*r*/30, Ptr_to_ULong(disp_cp_chain_me), mode64); 3988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtctr r30 */ 3989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFX(p, /*r*/30, 9, 467); 3990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bctrl */ 3991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 1); 3992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* --- END of PATCHABLE BYTES --- */ 3993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 3995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XDirect.cond.test != Pct_ALWAYS) { 3996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 3997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta >= 16 && delta <= 64 && 0 == (delta & 3)); 3998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bc !ct,cf,delta */ 3999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mkFormB(ptmp, invertCondTest(i->Pin.XDirect.cond.test), 4000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.cond.flag, (delta>>2), 0, 0); 4001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 4003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XIndir: { 4006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We're generating transfers that could lead indirectly to a 4007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng chain-me, so we need to be sure this is actually allowed -- 4008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng no-redir translations are not allowed to reach normal 4009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng translations without going through the scheduler. That means 4010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng no XDirects or XIndirs out from no-redir translations. 4011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Hence: */ 4012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_xindir != NULL); 4013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional jump 4015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng over the rest of it. Or at least, leave a space for it that 4016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we will shortly fill in. */ 4017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 4018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XIndir.cond.test != Pct_ALWAYS) { 4019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XIndir.cond.flag != Pcf_NONE); 4020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 4021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 4; 4022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 4023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XIndir.cond.flag == Pcf_NONE); 4024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest CIA. */ 4027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* stw/std r-dstGA, amCIA */ 4028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word( 4029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, False/*!isLoad*/, 4030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng iregNo(i->Pin.XIndir.dstGA, mode64), 4031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.amCIA, mode64 4032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ); 4033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r30, VG_(disp_cp_xindir) */ 4035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, /*r*/30, (ULong)Ptr_to_ULong(disp_cp_xindir), mode64); 4036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtctr r30 */ 4037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFX(p, /*r*/30, 9, 467); 4038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bctr */ 4039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0); 4040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 4042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XIndir.cond.test != Pct_ALWAYS) { 4043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 4044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta >= 16 && delta <= 32 && 0 == (delta & 3)); 4045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bc !ct,cf,delta */ 4046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mkFormB(ptmp, invertCondTest(i->Pin.XIndir.cond.test), 4047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.cond.flag, (delta>>2), 0, 0); 4048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 4050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XAssisted: { 4053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional jump 4054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng over the rest of it. Or at least, leave a space for it that 4055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we will shortly fill in. */ 4056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 4057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XAssisted.cond.test != Pct_ALWAYS) { 4058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XAssisted.cond.flag != Pcf_NONE); 4059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 4060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 4; 4061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 4062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XAssisted.cond.flag == Pcf_NONE); 4063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest CIA. */ 4066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* stw/std r-dstGA, amCIA */ 4067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word( 4068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, False/*!isLoad*/, 4069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng iregNo(i->Pin.XIndir.dstGA, mode64), 4070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.amCIA, mode64 4071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ); 4072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r31, $magic_number */ 4074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt trcval = 0; 4075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.XAssisted.jk) { 4076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_ClientReq: trcval = VEX_TRC_JMP_CLIENTREQ; break; 4077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break; 4078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Sys_int128: trcval = VEX_TRC_JMP_SYS_INT128; break; 4079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Yield: trcval = VEX_TRC_JMP_YIELD; break; 4080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_EmWarn: trcval = VEX_TRC_JMP_EMWARN; break; 4081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_EmFail: trcval = VEX_TRC_JMP_EMFAIL; break; 4082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_MapFail: trcval = VEX_TRC_JMP_MAPFAIL; break; 4083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_NoDecode: trcval = VEX_TRC_JMP_NODECODE; break; 4084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_TInval: trcval = VEX_TRC_JMP_TINVAL; break; 4085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_NoRedir: trcval = VEX_TRC_JMP_NOREDIR; break; 4086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_SigTRAP: trcval = VEX_TRC_JMP_SIGTRAP; break; 4087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_SigSEGV: trcval = VEX_TRC_JMP_SIGSEGV; break; 4088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_SigBUS: trcval = VEX_TRC_JMP_SIGBUS; break; 4089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_Boring: trcval = VEX_TRC_JMP_BORING; break; 4090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We don't expect to see the following being assisted. */ 4091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Ret: 4092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Call: 4093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fallthrough */ 4094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 4095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppIRJumpKind(i->Pin.XAssisted.jk); 4096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("emit_ARMInstr.Pin_XAssisted: unexpected jump kind"); 4097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(trcval != 0); 4099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, /*r*/31, trcval, mode64); 4100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r30, VG_(disp_cp_xassisted) */ 4102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, /*r*/30, 4103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (ULong)Ptr_to_ULong(disp_cp_xassisted), mode64); 4104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtctr r30 */ 4105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFX(p, /*r*/30, 9, 467); 4106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bctr */ 4107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0); 4108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Fix up the conditional jump, if there was one. */ 4110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XAssisted.cond.test != Pct_ALWAYS) { 4111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int delta = p - ptmp; 4112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta >= 16 && delta <= 32 && 0 == (delta & 3)); 4113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,delta */ 4114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mkFormB(ptmp, invertCondTest(i->Pin.XAssisted.cond.test), 4115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.cond.flag, (delta>>2), 0, 0); 4116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_CMov: { 4121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst, r_src; 4122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong imm_src; 4123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 4124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(i->Pin.CMov.cond.test != Pct_ALWAYS); 4125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_dst = iregNo(i->Pin.CMov.dst, mode64); 4127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cond = i->Pin.CMov.cond; 4128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* branch (if cond fails) over move instrs */ 4130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 4131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test != Pct_ALWAYS) { 4132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* don't know how many bytes to jump over yet... 4133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown make space for a jump instruction and fill in later. */ 4134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ptmp = p; /* fill in this bit later */ 4135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p += 4; 4136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // cond true: move src => dst 4139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.CMov.src->tag) { 4140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Imm: 4141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm_src = i->Pin.CMov.src->Pri.Imm; 4142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkLoadImm(p, r_dst, imm_src, mode64); // p += 4|8|20 4143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Reg: 4145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_src = iregNo(i->Pin.CMov.src->Pri.Reg, mode64); 4146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkMoveReg(p, r_dst, r_src); // p += 4 4147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: goto bad; 4149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Fix up the conditional jump, if there was one. */ 4152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test != Pct_ALWAYS) { 4153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int delta = p - ptmp; 4154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(delta >= 8 && delta <= 24); 4155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,delta */ 4156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mkFormB(ptmp, invertCondTest(cond.test), 4157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cond.flag, (delta>>2), 0, 0); 4158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Load: { 4163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am_addr = i->Pin.Load.src; 4164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Load.dst, mode64); 4165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc1, opc2, sz = i->Pin.Load.sz; 4166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (am_addr->tag) { 4167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_IR: 4168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mode64 && (sz == 4 || sz == 8)) { 4169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* should be guaranteed to us by iselWordExpr_AMode */ 4170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (am_addr->Pam.IR.index & 3)); 4171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch(sz) { 4173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 1: opc1 = 34; break; 4174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 2: opc1 = 40; break; 4175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 4: opc1 = 32; break; 4176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 8: opc1 = 58; vassert(mode64); break; 4177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: goto bad; 4178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_IR(p, opc1, r_dst, am_addr, mode64); 4180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_RR: 4182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch(sz) { 4183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 1: opc2 = 87; break; 4184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 2: opc2 = 279; break; 4185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 4: opc2 = 23; break; 4186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 8: opc2 = 21; vassert(mode64); break; 4187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: goto bad; 4188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_RR(p, 31, opc2, r_dst, am_addr, mode64); 4190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LoadL: { 4197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.LoadL.sz == 4) { 4198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.LoadL.dst, mode64), 4199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0, iregNo(i->Pin.LoadL.src, mode64), 20, 0); 4200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.LoadL.sz == 8 && mode64) { 4203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.LoadL.dst, mode64), 4204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0, iregNo(i->Pin.LoadL.src, mode64), 84, 0); 4205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Set: { 4211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Make the destination register be 1 or 0, depending on whether 4212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the relevant condition holds. */ 4213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Set.dst, mode64); 4214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond = i->Pin.Set.cond; 4215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt rot_imm, r_tmp; 4216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test == Pct_ALWAYS) { 4218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Just load 1 to dst => li dst,1 4219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 14, r_dst, 0, 1); 4220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 4221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vassert(cond.flag != Pcf_NONE); 4222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rot_imm = 1 + cond.flag; 4223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_tmp = 0; // Not set in getAllocable, so no need to declare. 4224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // r_tmp = CR => mfcr r_tmp 4226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_tmp, 0, 0, 19, 0); 4227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // r_dst = flag (rotate left and mask) 4229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // => rlwinm r_dst,r_tmp,rot_imm,31,31 4230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormM(p, 21, r_tmp, r_dst, rot_imm, 31, 31, 0); 4231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test == Pct_FALSE) { 4233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // flip bit => xori r_dst,r_dst,1 4234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 26, r_dst, r_dst, 1); 4235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MfCR: 4241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // mfcr dst 4242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.MfCR.dst, mode64), 0, 0, 19, 0); 4243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MFence: { 4246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, 0, 0, 0, 598, 0); // sync, PPC32 p616 4247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // CAB: Should this be isync? 4248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // p = mkFormXL(p, 19, 0, 0, 0, 150, 0); // isync, PPC32 p467 4249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Store: { 4253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am_addr = i->Pin.Store.dst; 4254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_src = iregNo(i->Pin.Store.src, mode64); 4255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc1, opc2, sz = i->Pin.Store.sz; 4256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.Store.dst->tag) { 4257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_IR: 4258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mode64 && (sz == 4 || sz == 8)) { 4259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* should be guaranteed to us by iselWordExpr_AMode */ 4260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (am_addr->Pam.IR.index & 3)); 4261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch(sz) { 4263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 1: opc1 = 38; break; 4264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 2: opc1 = 44; break; 4265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 4: opc1 = 36; break; 4266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 8: vassert(mode64); 4267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc1 = 62; break; 4268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_IR(p, opc1, r_src, am_addr, mode64); 4272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_RR: 4274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch(sz) { 4275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 1: opc2 = 215; break; 4276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 2: opc2 = 407; break; 4277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 4: opc2 = 151; break; 4278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 8: vassert(mode64); 4279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = 149; break; 4280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_RR(p, 31, opc2, r_src, am_addr, mode64); 4284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_StoreC: { 4292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.StoreC.sz == 4) { 4293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.StoreC.src, mode64), 4294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0, iregNo(i->Pin.StoreC.dst, mode64), 150, 1); 4295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.StoreC.sz == 8 && mode64) { 4298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.StoreC.src, mode64), 4299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0, iregNo(i->Pin.StoreC.dst, mode64), 214, 1); 4300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpUnary: { 4306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpUnary.dst); 4307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpUnary.src); 4308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.FpUnary.op) { 4309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_RSQRTE: // frsqrtre, PPC32 p424 4310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, 0, fr_src, 0, 26, 0 ); 4311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_RES: // fres, PPC32 p421 4313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, 0, fr_src, 0, 24, 0 ); 4314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_SQRT: // fsqrt, PPC32 p427 4316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, 0, fr_src, 0, 22, 0 ); 4317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_ABS: // fabs, PPC32 p399 4319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 264, 0); 4320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_NEG: // fneg, PPC32 p416 4322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 40, 0); 4323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MOV: // fmr, PPC32 p410 4325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 72, 0); 4326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIM: // frim, PPC ISA 2.05 p137 4328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 488, 0); 4329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIP: // frip, PPC ISA 2.05 p137 4331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 456, 0); 4332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIN: // frin, PPC ISA 2.05 p137 4334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 392, 0); 4335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIZ: // friz, PPC ISA 2.05 p137 4337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 424, 0); 4338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpBinary: { 4346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpBinary.dst); 4347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcL = fregNo(i->Pin.FpBinary.srcL); 4348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcR = fregNo(i->Pin.FpBinary.srcR); 4349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.FpBinary.op) { 4350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_ADDD: // fadd, PPC32 p400 4351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 21, 0 ); 4352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_ADDS: // fadds, PPC32 p401 4354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 21, 0 ); 4355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_SUBD: // fsub, PPC32 p429 4357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 20, 0 ); 4358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_SUBS: // fsubs, PPC32 p430 4360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 20, 0 ); 4361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MULD: // fmul, PPC32 p413 4363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcL, 0, fr_srcR, 25, 0 ); 4364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MULS: // fmuls, PPC32 p414 4366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcL, 0, fr_srcR, 25, 0 ); 4367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_DIVD: // fdiv, PPC32 p406 4369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 18, 0 ); 4370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_DIVS: // fdivs, PPC32 p407 4372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 18, 0 ); 4373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpMulAcc: { 4381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpMulAcc.dst); 4382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcML = fregNo(i->Pin.FpMulAcc.srcML); 4383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcMR = fregNo(i->Pin.FpMulAcc.srcMR); 4384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcAcc = fregNo(i->Pin.FpMulAcc.srcAcc); 4385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.FpMulAcc.op) { 4386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MADDD: // fmadd, PPC32 p408 4387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 29, 0 ); 4388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MADDS: // fmadds, PPC32 p409 4390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 29, 0 ); 4391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MSUBD: // fmsub, PPC32 p411 4393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 28, 0 ); 4394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MSUBS: // fmsubs, PPC32 p412 4396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 28, 0 ); 4397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdSt: { 4405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am_addr = i->Pin.FpLdSt.addr; 4406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt f_reg = fregNo(i->Pin.FpLdSt.reg); 4407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.FpLdSt.addr->tag == Pam_RR); 4408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.FpLdSt.sz; 4409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc; 4410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 4 || sz == 8); 4411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpLdSt.isLoad) { // Load from memory 4413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (idxd) { // lf[s|d]x, PPC32 p444|440 4414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc = (sz == 4) ? 535 : 599; 4415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_RR(p, 31, opc, f_reg, am_addr, mode64); 4416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // lf[s|d], PPC32 p441|437 4417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc = (sz == 4) ? 48 : 50; 4418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_IR(p, opc, f_reg, am_addr, mode64); 4419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // Store to memory 4421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (idxd) { // stf[s|d]x, PPC32 p521|516 4422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc = (sz == 4) ? 663 : 727; 4423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_RR(p, 31, opc, f_reg, am_addr, mode64); 4424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // stf[s|d], PPC32 p518|513 4425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc = (sz == 4) ? 52 : 54; 4426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_IR(p, opc, f_reg, am_addr, mode64); 4427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpSTFIW: { 4433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt ir_addr = iregNo(i->Pin.FpSTFIW.addr, mode64); 4434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_data = fregNo(i->Pin.FpSTFIW.data); 4435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // stfiwx (store fp64[lo32] as int32), PPC32 p517 4436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Use rA==0, so that EA == rB == ir_addr 4437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, fr_data, 0/*rA=0*/, ir_addr, 983, 0); 4438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpRSP: { 4442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpRSP.dst); 4443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpRSP.src); 4444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // frsp, PPC32 p423 4445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 12, 0); 4446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCftI: { 4450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpCftI.dst); 4451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpCftI.src); 4452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == True) { 4453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) { 4454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fctiw (conv f64 to i32), PPC32 p404 4455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 14, 0); 4456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 4458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fctiwu (conv f64 to u32) 4459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 142, 0); 4460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 4462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == False) { 4464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) { 4465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fctid (conv f64 to i64), PPC64 p437 4466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 814, 0); 4467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 4469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fctidu (conv f64 to u64) 4470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 942, 0); 4471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 4473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) { 4475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) { 4476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fcfid (conv i64 to f64), PPC64 p434 4477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 846, 0); 4478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else if (i->Pin.FpCftI.flt64 == True) { 4480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fcfidu (conv u64 to f64) 4481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 974, 0); 4482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 4484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fcfidus (conv u64 to f32) 4485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 59, fr_dst, 0, fr_src, 974, 0); 4486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 4488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCMov: { 4493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpCMov.dst); 4494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpCMov.src); 4495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cc = i->Pin.FpCMov.cond; 4496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (fr_dst == fr_src) goto done; 4498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cc.test != Pct_ALWAYS); 4500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* jmp fwds if !condition */ 4502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cc.test != Pct_ALWAYS) { 4503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,n_bytes>>2 */ 4504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormB(p, invertCondTest(cc.test), cc.flag, 8>>2, 0, 0); 4505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // fmr, PPC32 p410 4508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 72, 0); 4509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdFPSCR: { 4513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpLdFPSCR.src); 4514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFL(p, 0xFF, fr_src, i->Pin.FpLdFPSCR.dfp_rm); // mtfsf, PPC32 p480 4515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCmp: { 4519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar crfD = 1; 4520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.FpCmp.dst, mode64); 4521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcL = fregNo(i->Pin.FpCmp.srcL); 4522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcR = fregNo(i->Pin.FpCmp.srcR); 4523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(crfD < 8); 4524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // fcmpo, PPC32 p402 4525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, crfD<<2, fr_srcL, fr_srcR, 32, 0); 4526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // mfcr (mv CR to r_dst), PPC32 p467 4528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_dst, 0, 0, 19, 0); 4529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // rlwinm r_dst,r_dst,8,28,31, PPC32 p501 4531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // => rotate field 1 to bottomw of word, masking out upper 28 4532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0); 4533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_RdWrLR: { 4537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt reg = iregNo(i->Pin.RdWrLR.gpr, mode64); 4538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* wrLR==True ? mtlr r4 : mflr r4 */ 4539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXFX(p, reg, 8, (i->Pin.RdWrLR.wrLR==True) ? 467 : 339); 4540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* AltiVec */ 4545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdSt: { 4546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2, v_reg, r_idx, r_base; 4547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.AvLdSt.sz; 4548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.AvLdSt.addr->tag == Pam_RR); 4549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 1 || sz == 2 || sz == 4 || sz == 16); 4550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown v_reg = vregNo(i->Pin.AvLdSt.reg); 4552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_base = iregNo(i->Pin.AvLdSt.addr->Pam.RR.base, mode64); 4553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Only have AltiVec AMode_RR: kludge AMode_IR 4555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!idxd) { 4556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_idx = 30; // XXX: Using r30 as temp 4557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkLoadImm(p, r_idx, 4558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.addr->Pam.IR.index, mode64); 4559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 4560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_idx = iregNo(i->Pin.AvLdSt.addr->Pam.RR.index, mode64); 4561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpLdSt.isLoad) { // Load from memory (1,2,4,16) 4564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = (sz==1) ? 7 : (sz==2) ? 39 : (sz==4) ? 71 : 103; 4565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, v_reg, r_idx, r_base, opc2, 0); 4566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // Store to memory (1,2,4,16) 4567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = (sz==1) ? 135 : (sz==2) ? 167 : (sz==4) ? 199 : 231; 4568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, v_reg, r_idx, r_base, opc2, 0); 4569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUnary: { 4574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvUnary.dst); 4575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src = vregNo(i->Pin.AvUnary.src); 4576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvUnary.op) { 4578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MOV: opc2 = 1156; break; // vor vD,vS,vS 4579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_NOT: opc2 = 1284; break; // vnor vD,vS,vS 4580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKH8S: opc2 = 526; break; // vupkhsb 4581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKH16S: opc2 = 590; break; // vupkhsh 4582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKL8S: opc2 = 654; break; // vupklsb 4583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKL16S: opc2 = 718; break; // vupklsh 4584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKHPIX: opc2 = 846; break; // vupkhpx 4585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKLPIX: opc2 = 974; break; // vupklpx 4586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvUnary.op) { 4590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MOV: 4591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_NOT: 4592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_src, v_src, opc2 ); 4593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, 0, v_src, opc2 ); 4596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBinary: { 4602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBinary.dst); 4603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBinary.srcL); 4604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBinary.srcR); 4605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvBinary.op == Pav_SHL) { 4607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1036 ); // vslo 4608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_dst, v_srcR, 452 ); // vsl 4609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvBinary.op == Pav_SHR) { 4612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1100 ); // vsro 4613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_dst, v_srcR, 708 ); // vsr 4614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBinary.op) { 4617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Bitwise */ 4618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AND: opc2 = 1028; break; // vand 4619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OR: opc2 = 1156; break; // vor 4620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_XOR: opc2 = 1220; break; // vxor 4621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 4625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin8x16: { 4629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBin8x16.dst); 4630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBin8x16.srcL); 4631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBin8x16.srcR); 4632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBin8x16.op) { 4634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ADDU: opc2 = 0; break; // vaddubm 4636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDU: opc2 = 512; break; // vaddubs 4637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDS: opc2 = 768; break; // vaddsbs 4638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SUBU: opc2 = 1024; break; // vsububm 4640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBU: opc2 = 1536; break; // vsububs 4641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBS: opc2 = 1792; break; // vsubsbs 4642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULU: opc2 = 8; break; // vmuloub 4644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULS: opc2 = 264; break; // vmulosb 4645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULU: opc2 = 520; break; // vmuleub 4646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULS: opc2 = 776; break; // vmulesb 4647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGU: opc2 = 1026; break; // vavgub 4649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGS: opc2 = 1282; break; // vavgsb 4650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXU: opc2 = 2; break; // vmaxub 4651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXS: opc2 = 258; break; // vmaxsb 4652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINU: opc2 = 514; break; // vminub 4653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINS: opc2 = 770; break; // vminsb 4654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPEQU: opc2 = 6; break; // vcmpequb 4656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTU: opc2 = 518; break; // vcmpgtub 4657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTS: opc2 = 774; break; // vcmpgtsb 4658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHL: opc2 = 260; break; // vslb 4660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHR: opc2 = 516; break; // vsrb 4661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SAR: opc2 = 772; break; // vsrab 4662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ROTL: opc2 = 4; break; // vrlb 4663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGHI: opc2 = 12; break; // vmrghb 4665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGLO: opc2 = 268; break; // vmrglb 4666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 4671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin16x8: { 4675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBin16x8.dst); 4676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBin16x8.srcL); 4677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBin16x8.srcR); 4678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBin16x8.op) { 4680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ADDU: opc2 = 64; break; // vadduhm 4682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDU: opc2 = 576; break; // vadduhs 4683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDS: opc2 = 832; break; // vaddshs 4684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SUBU: opc2 = 1088; break; // vsubuhm 4686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBU: opc2 = 1600; break; // vsubuhs 4687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBS: opc2 = 1856; break; // vsubshs 4688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULU: opc2 = 72; break; // vmulouh 4690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULS: opc2 = 328; break; // vmulosh 4691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULU: opc2 = 584; break; // vmuleuh 4692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULS: opc2 = 840; break; // vmulesh 4693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGU: opc2 = 1090; break; // vavguh 4695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGS: opc2 = 1346; break; // vavgsh 4696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXU: opc2 = 66; break; // vmaxuh 4697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXS: opc2 = 322; break; // vmaxsh 4698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINS: opc2 = 834; break; // vminsh 4699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINU: opc2 = 578; break; // vminuh 4700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPEQU: opc2 = 70; break; // vcmpequh 4702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTU: opc2 = 582; break; // vcmpgtuh 4703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTS: opc2 = 838; break; // vcmpgtsh 4704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHL: opc2 = 324; break; // vslh 4706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHR: opc2 = 580; break; // vsrh 4707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SAR: opc2 = 836; break; // vsrah 4708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ROTL: opc2 = 68; break; // vrlh 4709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_PACKUU: opc2 = 14; break; // vpkuhum 4711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKUU: opc2 = 142; break; // vpkuhus 4712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSU: opc2 = 270; break; // vpkshus 4713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSS: opc2 = 398; break; // vpkshss 4714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_PACKPXL: opc2 = 782; break; // vpkpx 4715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGHI: opc2 = 76; break; // vmrghh 4717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGLO: opc2 = 332; break; // vmrglh 4718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 4723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32x4: { 4727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBin32x4.dst); 4728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBin32x4.srcL); 4729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBin32x4.srcR); 4730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBin32x4.op) { 4732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ADDU: opc2 = 128; break; // vadduwm 4734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDU: opc2 = 640; break; // vadduws 4735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDS: opc2 = 896; break; // vaddsws 4736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SUBU: opc2 = 1152; break; // vsubuwm 4738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBU: opc2 = 1664; break; // vsubuws 4739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBS: opc2 = 1920; break; // vsubsws 4740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGU: opc2 = 1154; break; // vavguw 4742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGS: opc2 = 1410; break; // vavgsw 4743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXU: opc2 = 130; break; // vmaxuw 4745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXS: opc2 = 386; break; // vmaxsw 4746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINS: opc2 = 898; break; // vminsw 4748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINU: opc2 = 642; break; // vminuw 4749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPEQU: opc2 = 134; break; // vcmpequw 4751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTS: opc2 = 902; break; // vcmpgtsw 4752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTU: opc2 = 646; break; // vcmpgtuw 4753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHL: opc2 = 388; break; // vslw 4755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHR: opc2 = 644; break; // vsrw 4756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SAR: opc2 = 900; break; // vsraw 4757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ROTL: opc2 = 132; break; // vrlw 4758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_PACKUU: opc2 = 78; break; // vpkuwum 4760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKUU: opc2 = 206; break; // vpkuwus 4761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSU: opc2 = 334; break; // vpkswus 4762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSS: opc2 = 462; break; // vpkswss 4763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGHI: opc2 = 140; break; // vmrghw 4765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGLO: opc2 = 396; break; // vmrglw 4766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 4771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32Fx4: { 4775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBin32Fx4.dst); 4776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBin32Fx4.srcL); 4777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBin32Fx4.srcR); 4778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBin32Fx4.op) { 4779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ADDF: 4781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 10 ); // vaddfp 4782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_SUBF: 4784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 74 ); // vsubfp 4785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MAXF: 4787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1034 ); // vmaxfp 4788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MINF: 4790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1098 ); // vminfp 4791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MULF: { 4794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Make a vmulfp from a vmaddfp: 4795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown load -0.0 (0x8000_0000) to each 32-bit word of vB 4796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this makes the add a noop. 4797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 4798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt vB = 29; // XXX: Using v29 for temp do not change 4799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // without also changing 4800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // getRegUsage_PPCInstr 4801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt konst = 0x1F; 4802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Better way to load -0.0 (0x80000000) ? 4804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // vspltisw vB,0x1F (0x1F => each word of vB) 4805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, vB, konst, 0, 908 ); 4806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // vslw vB,vB,vB (each word of vB = (0x1F << 0x1F) = 0x80000000 4808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, vB, vB, vB, 388 ); 4809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Finally, do the multiply: 4811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVA( p, 4, v_dst, v_srcL, vB, v_srcR, 46 ); 4812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPEQF: // vcmpeqfp 4815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 198 ); 4816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPGTF: // vcmpgtfp 4818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 710 ); 4819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPGEF: // vcmpgefp 4821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 454 ); 4822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUn32Fx4: { 4831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvUn32Fx4.dst); 4832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src = vregNo(i->Pin.AvUn32Fx4.src); 4833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvUn32Fx4.op) { 4835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_RCPF: opc2 = 266; break; // vrefp 4836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_RSQRTF: opc2 = 330; break; // vrsqrtefp 4837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CVTU2F: opc2 = 778; break; // vcfux 4838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CVTS2F: opc2 = 842; break; // vcfsx 4839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_QCVTF2U: opc2 = 906; break; // vctuxs 4840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_QCVTF2S: opc2 = 970; break; // vctsxs 4841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDM: opc2 = 714; break; // vrfim 4842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDP: opc2 = 650; break; // vrfip 4843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDN: opc2 = 522; break; // vrfin 4844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDZ: opc2 = 586; break; // vrfiz 4845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, 0, v_src, opc2 ); 4849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvPerm: { // vperm 4853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvPerm.dst); 4854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvPerm.srcL); 4855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvPerm.srcR); 4856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_ctl = vregNo(i->Pin.AvPerm.ctl); 4857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, v_ctl, 43 ); 4858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSel: { // vsel 4862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_ctl = vregNo(i->Pin.AvSel.ctl); 4863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvSel.dst); 4864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvSel.srcL); 4865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvSel.srcR); 4866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, v_ctl, 42 ); 4867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvShlDbl: { // vsldoi 4871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt shift = i->Pin.AvShlDbl.shift; 4872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvShlDbl.dst); 4873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvShlDbl.srcL); 4874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvShlDbl.srcR); 4875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(shift <= 0xF); 4876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, shift, 44 ); 4877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSplat: { // vsplt(is)(b,h,w) 4881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvShlDbl.dst); 4882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.AvSplat.sz; 4883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src, opc2; 4884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 8 || sz == 16 || sz == 32); 4885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvSplat.src->tag == Pvi_Imm) { 4887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char simm5; 4888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = (sz == 8) ? 780 : (sz == 16) ? 844 : 908; // 8,16,32 4889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* expects 5-bit-signed-imm */ 4890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown simm5 = i->Pin.AvSplat.src->Pvi.Imm5s; 4891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(simm5 >= -16 && simm5 <= 15); 4892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown simm5 = simm5 & 0x1F; 4893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, (UInt)simm5, 0, opc2 ); 4894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else { // Pri_Reg 4896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt lowest_lane; 4897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = (sz == 8) ? 524 : (sz == 16) ? 588 : 652; // 8,16,32 4898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(hregClass(i->Pin.AvSplat.src->Pvi.Reg) == HRcVec128); 4899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown v_src = vregNo(i->Pin.AvSplat.src->Pvi.Reg); 4900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lowest_lane = (128/sz)-1; 4901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, lowest_lane, v_src, opc2 ); 4902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvCMov: { 4907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvCMov.dst); 4908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src = vregNo(i->Pin.AvCMov.src); 4909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cc = i->Pin.AvCMov.cond; 4910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (v_dst == v_src) goto done; 4912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cc.test != Pct_ALWAYS); 4914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* jmp fwds 2 insns if !condition */ 4916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cc.test != Pct_ALWAYS) { 4917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,n_bytes>>2 */ 4918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormB(p, invertCondTest(cc.test), cc.flag, 8>>2, 0, 0); 4919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* vmr */ 4921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_src, v_src, 1156 ); 4922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdVSCR: { // mtvscr 4926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src = vregNo(i->Pin.AvLdVSCR.src); 4927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, 0, 0, v_src, 1604 ); 4928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Unary: { 4932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo( i->Pin.FpUnary.dst ); 4933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo( i->Pin.FpUnary.src ); 4934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp64Unary.op) { 4936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_MOV: // fmr, PPC32 p410 4937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, fr_dst, 0, fr_src, 72, 0 ); 4938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTDP: // D32 to D64 4940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 258, 0 ); 4941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DRSP: // D64 to D32 4943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 770, 0 ); 4944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCFFIX: // I64 to D64 conversion 4946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ONLY WORKS ON POWER7 */ 4947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 802, 0); 4948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTFIX: // D64 to I64 conversion 4950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 290, 0); 4951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DXEX: // Extract exponent 4953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 354, 0 ); 4954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 4956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 4957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 4959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Binary: { 4962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo( i->Pin.Dfp64Binary.dst ); 4963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo( i->Pin.Dfp64Binary.srcL ); 4964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo( i->Pin.Dfp64Binary.srcR ); 4965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp64Binary.op) { 4966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPADD: /* dadd, dfp add, use default RM from reg ignore mode 4967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * from the Iop instruction. */ 4968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 2, 0 ); 4969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPSUB: /* dsub, dfp subtract, use default RM from reg ignore 4971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * mode from the Iop instruction. */ 4972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 514, 0 ); 4973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPMUL: /* dmul, dfp multipy, use default RM from reg ignore 4975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * mode from the Iop instruction. */ 4976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 34, 0 ); 4977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPDIV: /* ddiv, dfp divide, use default RM from reg ignore 4979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * mode from the Iop instruction. */ 4980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 546, 0 ); 4981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DIEX: /* diex, insert exponent */ 4983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 866, 0 ); 4984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 4986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 4987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 4989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift: { 4992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Pin.DfpShift.src); 4993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Pin.DfpShift.dst); 4994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt shift; 4995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng shift = i->Pin.DfpShift.shift->Pri.Imm; 4997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.DfpShift.op) { 4999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DSCLI: /* dscli, DFP shift left by fr_srcR */ 5000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ22( p, 59, fr_dst, fr_src, shift, 66, 0 ); 5001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DSCRI: /* dscri, DFP shift right by fr_srcR */ 5003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ22( p, 59, fr_dst, fr_src, shift, 98, 0 ); 5004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ERROR: emit_PPCInstr default case\n"); 5007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ExtractExpD128: { 5013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Pin.ExtractExpD128.dst); 5014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcHi = fregNo(i->Pin.ExtractExpD128.src_hi); 5015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcLo = fregNo(i->Pin.ExtractExpD128.src_lo); 5016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.ExtractExpD128.op) { 5018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DXEXQ: 5019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 12, 0, fr_srcHi, 72, 0); 5023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 13, 0, fr_srcLo, 72, 0); 5024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, 12, 354, 0 ); 5025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 64-bit result in 5027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register 10. 5028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst, 0, 10, 72, 0); 5030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("Error: emit_PPCInstr case Pin_DfpExtractExp, case inst Default\n"); 5033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Unary: { 5038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo(i->Pin.Dfp128Unary.dst_hi); 5039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo(i->Pin.Dfp128Unary.dst_lo); 5040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcLo = fregNo(i->Pin.Dfp128Unary.src_lo); 5041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do instruction with 128-bit source operands in registers (10,11) 5043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * and (12,13). 5044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp128Unary.op) { 5046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTQPQ: // D64 to D128, srcLo holds 64 bit operand 5047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 12, 0, fr_srcLo, 72, 0); 5048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, 12, 258, 0 ); 5050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result in 5052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("Error: emit_PPCInstr case Pin_Dfp128Unary, case inst Default\ 5060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng\n"); 5061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Binary: { 5067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to supply the left source operand and return 5068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * the result. 5069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo( i->Pin.Dfp128Binary.dst_hi ); 5071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo( i->Pin.Dfp128Binary.dst_lo ); 5072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcRHi = fregNo( i->Pin.Dfp128Binary.srcR_hi ); 5073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcRLo = fregNo( i->Pin.Dfp128Binary.srcR_lo ); 5074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, fr_dstHi, 72, 0 ); 5079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 11, 0, fr_dstLo, 72, 0 ); 5080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 12, 0, fr_srcRHi, 72, 0 ); 5081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 13, 0, fr_srcRLo, 72, 0 ); 5082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do instruction with 128-bit source operands in registers (10,11) 5084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * and (12,13). 5085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp128Binary.op) { 5087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPADDQ: 5088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 10, 12, 2, 0 ); 5089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPSUBQ: 5091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 10, 12, 514, 0 ); 5092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPMULQ: 5094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 10, 12, 34, 0 ); 5095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPDIVQ: 5097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 10, 12, 546, 0 ); 5098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result in 5104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift128: { 5113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src_hi = fregNo(i->Pin.DfpShift128.src_hi); 5114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src_lo = fregNo(i->Pin.DfpShift128.src_lo); 5115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst_hi = fregNo(i->Pin.DfpShift128.dst_hi); 5116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst_lo = fregNo(i->Pin.DfpShift128.dst_lo); 5117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt shift; 5118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng shift = i->Pin.DfpShift128.shift->Pri.Imm; 5120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* setup source operand in register 12, 13 pair */ 5122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_src_hi, 72, 0); 5123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_src_lo, 72, 0); 5124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* execute instruction putting result in register 10, 11 pair */ 5126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.DfpShift128.op) { 5127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DSCLIQ: /* dscliq, DFP shift left, fr_srcR is the integer 5128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * shift amount. 5129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ22( p, 63, 10, 12, shift, 66, 0 ); 5131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DSCRIQ: /* dscriq, DFP shift right, fr_srcR is the integer 5133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * shift amount. 5134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ22( p, 63, 10, 12, shift, 98, 0 ); 5136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ERROR: emit_PPCInstr quad default case %d \n", 5139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.op); 5140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction put the 128-bit result in registers (10,11). 5144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Note, the operand in the instruction only reference the first of 5145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * the two registers in the pair. 5146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst_hi, 0, 10, 72, 0); 5148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst_lo, 0, 11, 72, 0); 5149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound: { 5153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Pin.DfpRound.dst); 5154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Pin.DfpRound.src); 5155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_rmc, r, rmc; 5156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_rmc = i->Pin.DfpRound.r_rmc->Pri.Imm; 5158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r = (r_rmc & 0x8) >> 3; 5159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rmc = r_rmc & 0x3; 5160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // drintx 5162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 59, fr_dst, r, fr_src, rmc, 99, 0); 5163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound128: { 5167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo(i->Pin.DfpRound128.dst_hi); 5168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo(i->Pin.DfpRound128.dst_lo); 5169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcHi = fregNo(i->Pin.DfpRound128.src_hi); 5170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcLo = fregNo(i->Pin.DfpRound128.src_lo); 5171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_rmc, r, rmc; 5172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_rmc = i->Pin.DfpRound128.r_rmc->Pri.Imm; 5174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r = (r_rmc & 0x8) >> 3; 5175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rmc = r_rmc & 0x3; 5176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_srcHi, 72, 0); 5181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_srcLo, 72, 0); 5182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do drintx instruction with 128-bit source operands in 5184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (12,13). 5185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 63, 10, r, 12, rmc, 99, 0); 5187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result in 5189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize: { 5198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Pin.DfpQuantize.dst); 5199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Pin.DfpQuantize.srcL); 5200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Pin.DfpQuantize.srcR); 5201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt rmc; 5202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rmc = i->Pin.DfpQuantize.rmc->Pri.Imm; 5204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.DfpQuantize.op) { 5206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DQUA: 5207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 59, fr_dst, fr_srcL, fr_srcR, rmc, 3, 0); 5208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_RRDTR: 5210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 59, fr_dst, fr_srcL, fr_srcR, rmc, 35, 0); 5211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize128: { 5219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst_hi = fregNo(i->Pin.DfpQuantize128.dst_hi); 5220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst_lo = fregNo(i->Pin.DfpQuantize128.dst_lo); 5221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src_hi = fregNo(i->Pin.DfpQuantize128.src_hi); 5222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src_lo = fregNo(i->Pin.DfpQuantize128.src_lo); 5223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt rmc; 5224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rmc = i->Pin.DfpQuantize128.rmc->Pri.Imm; 5226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pairs. Note, left source operand passed in via the 5228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * dst register pair. 5229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 10, 0, fr_dst_hi, 72, 0); 5231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 11, 0, fr_dst_lo, 72, 0); 5232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_src_hi, 72, 0); 5233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_src_lo, 72, 0); 5234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do dquaq instruction with 128-bit source operands in 5236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (12,13). 5237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.DfpQuantize128.op) { 5239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DQUAQ: 5240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 63, 10, 10, 12, rmc, 3, 0); 5241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DRRNDQ: 5243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 63, 10, 10, 12, rmc, 35, 0); 5244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("Pin_DfpQuantize128: default case, couldn't find inst to issue \n"); 5247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result in 5251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst_hi, 0, 10, 72, 0); 5255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst_lo, 0, 11, 72, 0); 5256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpD128toD64: { 5260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo( i->Pin.DfpD128toD64.dst ); 5261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcHi = fregNo( i->Pin.DfpD128toD64.src_hi ); 5262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcLo = fregNo( i->Pin.DfpD128toD64.src_lo ); 5263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, fr_dst, 72, 0 ); 5268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 12, 0, fr_srcHi, 72, 0 ); 5269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 13, 0, fr_srcLo, 72, 0 ); 5270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do instruction with 128-bit source operands in registers (10,11) */ 5272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp128Binary.op) { 5273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DRDPQ: 5274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, 12, 770, 0 ); 5275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTFIXQ: 5277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, 12, 290, 0 ); 5278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 64-bit result in registers 10. */ 5284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst, 0, 10, 72, 0); 5285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpI64StoD128: { 5289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo( i->Pin.DfpI64StoD128.dst_hi ); 5290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo( i->Pin.DfpI64StoD128.dst_lo ); 5291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo( i->Pin.DfpI64StoD128.src ); 5292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp128Binary.op) { 5294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCFFIXQ: 5295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 11, fr_src, 802, 0 ); 5296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 64-bit result in registers 10, 11. */ 5302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_InsertExpD128: { 5308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo(i->Pin.InsertExpD128.dst_hi); 5309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo(i->Pin.InsertExpD128.dst_lo); 5310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Pin.InsertExpD128.srcL); 5311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcRHi = fregNo(i->Pin.InsertExpD128.srcR_hi); 5312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcRLo = fregNo(i->Pin.InsertExpD128.srcR_lo); 5313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The left operand is a single F64 value, the right is an F128 5315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 10, 0, fr_srcL, 72, 0); 5318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_srcRHi, 72, 0); 5319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_srcRLo, 72, 0); 5320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 10, 10, 12, 866, 0 ); 5321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result into 5323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Cmp:{ 5332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar crfD = 1; 5333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Pin.Dfp64Cmp.dst, mode64); 5334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Pin.Dfp64Cmp.srcL); 5335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Pin.Dfp64Cmp.srcR); 5336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(crfD < 8); 5337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // dcmpo, dcmpu 5338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 59, crfD<<2, fr_srcL, fr_srcR, 130, 0); 5339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // mfcr (mv CR to r_dst) 5341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 31, r_dst, 0, 0, 19, 0); 5342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // rlwinm r_dst,r_dst,8,28,31 5344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // => rotate field 1 to bottomw of word, masking out upper 28 5345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0); 5346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Cmp: { 5350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar crfD = 1; 5351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Pin.Dfp128Cmp.dst, mode64); 5352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL_hi = fregNo(i->Pin.Dfp128Cmp.srcL_hi); 5353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL_lo = fregNo(i->Pin.Dfp128Cmp.srcL_lo); 5354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR_hi = fregNo(i->Pin.Dfp128Cmp.srcR_hi); 5355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR_lo = fregNo(i->Pin.Dfp128Cmp.srcR_lo); 5356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(crfD < 8); 5357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // dcmpoq, dcmpuq 5358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 10, 0, fr_srcL_hi, 72, 0); 5362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 11, 0, fr_srcL_lo, 72, 0); 5363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_srcR_hi, 72, 0); 5364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_srcR_lo, 72, 0); 5365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, crfD<<2, 10, 12, 130, 0); 5367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // mfcr (mv CR to r_dst) 5369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 31, r_dst, 0, 0, 19, 0); 5370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // rlwinm r_dst,r_dst,8,28,31 5372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // => rotate field 1 to bottomw of word, masking out upper 28 5373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0); 5374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_EvCheck: { 5378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* This requires a 32-bit dec/test in both 32- and 64-bit 5379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng modes. */ 5380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We generate: 5381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lwz r30, amCounter 5382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addic. r30, r30, -1 5383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng stw r30, amCounter 5384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bge nofail 5385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lwz/ld r30, amFailAddr 5386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctr 5388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nofail: 5389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p0 = p; 5391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lwz r30, amCounter */ 5392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_word32(p, True/*isLoad*/, /*r*/30, 5393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amCounter, mode64); 5394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addic. r30,r30,-1 */ 5395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x37DEFFFF); 5396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* stw r30, amCounter */ 5397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_word32(p, False/*!isLoad*/, /*r*/30, 5398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amCounter, mode64); 5399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bge nofail */ 5400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x40800010); 5401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lwz/ld r30, amFailAddr */ 5402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word(p, True/*isLoad*/, /*r*/30, 5403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amFailAddr, mode64); 5404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtctr r30 */ 5405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFX(p, /*r*/30, 9, 467); 5406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bctr */ 5407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0); 5408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nofail: */ 5409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Crosscheck */ 5411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(evCheckSzB_PPC() == (UChar*)p - (UChar*)p0); 5412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ProfInc: { 5416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We generate: 5417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (ctrP is unknown now, so use 0x65556555(65556555) in the 5418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng expectation that a later call to LibVEX_patchProfCtr 5419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng will be used to fill in the immediate fields once the 5420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng right value is known.) 5421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 32-bit: 5422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32-exactly r30, 0x65556555 5423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lwz r29, 4(r30) 5424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addic. r29, r29, 1 5425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng stw r29, 4(r30) 5426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lwz r29, 0(r30) 5427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addze r29, r29 5428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng stw r29, 0(r30) 5429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 64-bit: 5430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm64-exactly r30, 0x6555655565556555 5431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ld r29, 0(r30) 5432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addi r29, r29, 1 5433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng std r29, 0(r30) 5434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 5436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5( 5437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, /*r*/30, 0x6555655565556555ULL, True/*mode64*/); 5438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0xEBBE0000); 5439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x3BBD0001); 5440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0xFBBE0000); 5441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 5442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5( 5443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, /*r*/30, 0x65556555ULL, False/*!mode64*/); 5444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x83BE0004); 5445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x37BD0001); 5446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x93BE0004); 5447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x83BE0000); 5448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x7FBD0194); 5449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x93BE0000); 5450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Tell the caller .. */ 5452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!(*is_profInc)); 5453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *is_profInc = True; 5454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 5458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 5459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bad: 5462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("\n=> "); 5463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCInstr(i, mode64); 5464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("emit_PPCInstr"); 5465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*NOTREACHED*/ 5466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown done: 5468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(p - &buf[0] <= 64); 5469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p - &buf[0]; 5470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 5471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check? See case for Pin_EvCheck in 5474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emit_PPCInstr just above. That crosschecks what this returns, so 5475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we can tell if we're inconsistent. */ 5476663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt evCheckSzB_PPC ( void ) 5477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 5478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 28; 5479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 5480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the 5483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emitInstr case for XDirect, above. */ 5484663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange chainXDirect_PPC ( void* place_to_chain, 5485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_EXPECTED, 5486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to, 5487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 5488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 5489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* What we're expecting to see is: 5490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32/64-fixed r30, disp_cp_chain_me_to_EXPECTED 5491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctrl 5493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 5494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 5495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 7F C9 03 A6 5496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4E 80 04 21 5497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_chain; 5499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 5500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/30, 5501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(disp_cp_chain_me_EXPECTED), 5502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64)); 5503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x7FC903A6); 5504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x4E800421); 5505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* And what we want to change it to is: 5506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32/64-fixed r30, place_to_jump_to 5507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctr 5509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 5510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 5511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 7F C9 03 A6 5512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4E 80 04 20 5513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The replacement has the same length as the original. 5514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/30, 5516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(place_to_jump_to), mode64); 5517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x7FC903A6); 5518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x4E800420); 5519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = p - (UChar*)place_to_chain; 5521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == (mode64 ? 28 : 16)); /* stay sane */ 5522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_chain, len}; 5523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 5524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 5525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the 5528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emitInstr case for XDirect, above. */ 5529663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange unchainXDirect_PPC ( void* place_to_unchain, 5530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to_EXPECTED, 5531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me, 5532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 5533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 5534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* What we're expecting to see is: 5535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32/64-fixed r30, place_to_jump_to_EXPECTED 5536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctr 5538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 5539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 5540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 7F C9 03 A6 5541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4E 80 04 20 5542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_unchain; 5544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 5545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/30, 5546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(place_to_jump_to_EXPECTED), 5547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64)); 5548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x7FC903A6); 5549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x4E800420); 5550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* And what we want to change it to is: 5551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32/64-fixed r30, disp_cp_chain_me 5552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctrl 5554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 5555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 5556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 7F C9 03 A6 5557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4E 80 04 21 5558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The replacement has the same length as the original. 5559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/30, 5561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(disp_cp_chain_me), mode64); 5562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x7FC903A6); 5563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x4E800421); 5564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = p - (UChar*)place_to_unchain; 5566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == (mode64 ? 28 : 16)); /* stay sane */ 5567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_unchain, len}; 5568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 5569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 5570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter address into a profile inc point, as previously 5573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng created by the Pin_ProfInc case for emit_PPCInstr. */ 5574663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange patchProfInc_PPC ( void* place_to_patch, 5575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ULong* location_of_counter, 5576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 5577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 5578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_patch; 5579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 5580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = 0; 5582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 5583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/30, 5584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x6555655565556555ULL, True/*mode64*/)); 5585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 20) == 0xEBBE0000); 5586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 24) == 0x3BBD0001); 5587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 28) == 0xFBBE0000); 5588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/30, 5589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(location_of_counter), 5590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng True/*mode64*/); 5591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng len = p - (UChar*)place_to_patch; 5592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == 20); 5593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 5594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/30, 5595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x65556555ULL, False/*!mode64*/)); 5596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 8) == 0x83BE0004); 5597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 12) == 0x37BD0001); 5598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 16) == 0x93BE0004); 5599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 20) == 0x83BE0000); 5600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 24) == 0x7FBD0194); 5601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 28) == 0x93BE0000); 5602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/30, 5603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(location_of_counter), 5604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng False/*!mode64*/); 5605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng len = p - (UChar*)place_to_patch; 5606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == 8); 5607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_patch, len}; 5609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 5610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 5611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 5614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end host_ppc_defs.c ---*/ 5615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 5616