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 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2004-2013 OpenWorks LLP 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown info@open-works.net 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU General Public License as 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown published by the Free Software Foundation; either version 2 of the 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, or (at your option) any later version. 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown General Public License for more details. 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU General Public License 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown along with this program; if not, write to the Free Software 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02110-1301, USA. 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The GNU General Public License is contained in the file COPYING. 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Neither the names of the U.S. Department of Energy nor the 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown University of California nor the names of its contributors may be 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown used to endorse or promote products derived from this software 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown without prior written permission. 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#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; 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov static const 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 276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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 575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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 586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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 597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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 609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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 658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* 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 */ 677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ADDU: return "vaddu_m"; // b,h,w,dw 678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_QADDU: return "vaddu_s"; // b,h,w,dw 679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_QADDS: return "vadds_s"; // b,h,w,dw 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SUBU: return "vsubu_m"; // b,h,w,dw 682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_QSUBU: return "vsubu_s"; // b,h,w,dw 683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_QSUBS: return "vsubs_s"; // b,h,w,dw 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_MULU: return "vmulu"; // w 686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_OMULU: return "vmulou"; // b,h,w 687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_OMULS: return "vmulos"; // b,h,w 688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_EMULU: return "vmuleu"; // b,h,w 689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_EMULS: return "vmules"; // b,h,w 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGU: return "vavgu"; // b,h,w 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGS: return "vavgs"; // b,h,w 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXU: return "vmaxu"; // b,h,w 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXS: return "vmaxs"; // b,h,w 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINU: return "vminu"; // b,h,w 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINS: return "vmins"; // b,h,w 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Compare (always affects CR field 6) */ 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPEQU: return "vcmpequ"; // b,h,w 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTU: return "vcmpgtu"; // b,h,w 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTS: return "vcmpgts"; // b,h,w 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Shift */ 706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SHL: return "vsl"; // ' ',b,h,w,dw 707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SHR: return "vsr"; // ' ',b,h,w,dw 708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SAR: return "vsra"; // b,h,w,dw 709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ROTL: return "vrl"; // b,h,w,dw 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Pack */ 712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_PACKUU: return "vpku_um"; // h,w,dw 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKUU: return "vpku_us"; // h,w 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSU: return "vpks_us"; // h,w 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSS: return "vpks_ss"; // h,w 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_PACKPXL: return "vpkpx"; 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Merge */ 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGHI: return "vmrgh"; // b,h,w 720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGLO: return "vmrgl"; // b,h,w 721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Concatenation */ 723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CATODD: return "vmrgow"; // w 724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CATEVEN: return "vmrgew"; // w 725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* SHA */ 727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SHA256: return "vshasigmaw"; // w 728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SHA512: return "vshasigmaw"; // dw 729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* BCD */ 731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_BCDAdd: return "bcdadd."; // qw 732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_BCDSub: return "bcdsub."; // qw 733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Polynomial arith */ 735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_POLYMULADD: return "vpmsum"; // b, h, w, d 736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Cipher */ 738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CIPHERV128: case Pav_CIPHERLV128: 739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_NCIPHERV128: case Pav_NCIPHERLV128: 740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CIPHERSUBV128: return "v_cipher_"; // qw 741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* zero count */ 743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ZEROCNTBYTE: case Pav_ZEROCNTWORD: 744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ZEROCNTHALF: case Pav_ZEROCNTDBL: 745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return "vclz_"; // b, h, w, d 746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* vector gather (byte-by-byte bit matrix transpose) */ 748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_BITMTXXPOSE: 749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return "vgbbd"; 750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("showPPCAvOp"); 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* showPPCAvFpOp ( PPCAvFpOp op ) { 756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (op) { 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Floating Point Binary */ 758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ADDF: return "vaddfp"; 759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_SUBF: return "vsubfp"; 760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MULF: return "vmaddfp"; 761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MAXF: return "vmaxfp"; 762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MINF: return "vminfp"; 763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPEQF: return "vcmpeqfp"; 764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPGTF: return "vcmpgtfp"; 765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPGEF: return "vcmpgefp"; 766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Floating Point Unary */ 768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_RCPF: return "vrefp"; 769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_RSQRTF: return "vrsqrtefp"; 770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CVTU2F: return "vcfux"; 771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CVTS2F: return "vcfsx"; 772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_QCVTF2U: return "vctuxs"; 773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_QCVTF2S: return "vctsxs"; 774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDM: return "vrfim"; 775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDP: return "vrfip"; 776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDN: return "vrfin"; 777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDZ: return "vrfiz"; 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("showPPCAvFpOp"); 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_LI ( HReg dst, ULong imm64, Bool mode64 ) 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_LI; 787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LI.dst = dst; 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LI.imm64 = imm64; 789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) 790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert( (Long)imm64 == (Long)(Int)(UInt)imm64 ); 791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Alu ( PPCAluOp op, HReg dst, 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, PPCRH* srcR ) { 795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Alu; 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Alu.op = op; 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Alu.dst = dst; 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Alu.srcL = srcL; 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Alu.srcR = srcR; 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Shft ( PPCShftOp op, Bool sz32, 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg srcL, PPCRH* srcR ) { 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Shft; 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.op = op; 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.sz32 = sz32; 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.dst = dst; 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.srcL = srcL; 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.srcR = srcR; 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AddSubC ( Bool isAdd, Bool setC, 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg srcL, HReg srcR ) { 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AddSubC; 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.isAdd = isAdd; 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.setC = setC; 820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.dst = dst; 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.srcL = srcL; 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.srcR = srcR; 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Cmp ( Bool syned, Bool sz32, 826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt crfD, HReg srcL, PPCRH* srcR ) { 827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Cmp; 829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.syned = syned; 830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.sz32 = sz32; 831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.crfD = crfD; 832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.srcL = srcL; 833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.srcR = srcR; 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Unary ( PPCUnaryOp op, HReg dst, HReg src ) { 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Unary; 839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Unary.op = op; 840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Unary.dst = dst; 841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Unary.src = src; 842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MulL ( Bool syned, Bool hi, Bool sz32, 845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg srcL, HReg srcR ) { 846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_MulL; 848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.syned = syned; 849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.hi = hi; 850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.sz32 = sz32; 851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.dst = dst; 852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.srcL = srcL; 853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.srcR = srcR; 854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* if doing the low word, the signedness is irrelevant, but tie it 855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown down anyway. */ 856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!hi) vassert(!syned); 857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_Div ( Bool extended, Bool syned, Bool sz32, 860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg srcL, HReg srcR ) { 861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Div; 863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov i->Pin.Div.extended = extended; 864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.syned = syned; 865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.sz32 = sz32; 866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.dst = dst; 867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.srcL = srcL; 868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.srcR = srcR; 869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Call ( PPCCondCode cond, 872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Addr64 target, UInt argiregs, RetLoc rloc ) { 873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt mask; 874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Call; 876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Call.cond = cond; 877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Call.target = target; 878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Call.argiregs = argiregs; 879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.Call.rloc = rloc; 880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Only r3 .. r10 inclusive may be used as arg regs. Hence: */ 881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mask = (1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10); 882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (argiregs & ~mask)); 883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(is_sane_RetLoc(rloc)); 884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 886663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XDirect ( Addr64 dstGA, PPCAMode* amCIA, 887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond, Bool toFastEP ) { 888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_XDirect; 890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.dstGA = dstGA; 891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.amCIA = amCIA; 892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.cond = cond; 893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.toFastEP = toFastEP; 894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 896663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XIndir ( HReg dstGA, PPCAMode* amCIA, 897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond ) { 898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_XIndir; 900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.dstGA = dstGA; 901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.amCIA = amCIA; 902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.cond = cond; 903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 905663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_XAssisted ( HReg dstGA, PPCAMode* amCIA, 906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCCondCode cond, IRJumpKind jk ) { 907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_XAssisted; 909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.dstGA = dstGA; 910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.amCIA = amCIA; 911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.cond = cond; 912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.jk = jk; 913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_CMov ( PPCCondCode cond, 916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, PPCRI* src ) { 917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_CMov; 919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.CMov.cond = cond; 920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.CMov.src = src; 921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.CMov.dst = dst; 922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cond.test != Pct_ALWAYS); 923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Load ( UChar sz, 926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, PPCAMode* src, Bool mode64 ) { 927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Load; 929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Load.sz = sz; 930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Load.src = src; 931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Load.dst = dst; 932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8); 933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz == 8) vassert(mode64); 934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_LoadL ( UChar sz, 937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg dst, HReg src, Bool mode64 ) 938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_LoadL; 941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LoadL.sz = sz; 942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LoadL.src = src; 943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LoadL.dst = dst; 944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 4 || sz == 8); 945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz == 8) vassert(mode64); 946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Store ( UChar sz, PPCAMode* dst, HReg src, 949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool mode64 ) { 950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Store; 952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Store.sz = sz; 953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Store.src = src; 954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Store.dst = dst; 955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8); 956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz == 8) vassert(mode64); 957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_StoreC ( UChar sz, HReg dst, HReg src, Bool mode64 ) { 960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_StoreC; 962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.StoreC.sz = sz; 963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.StoreC.src = src; 964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.StoreC.dst = dst; 965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 4 || sz == 8); 966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz == 8) vassert(mode64); 967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_Set ( PPCCondCode cond, HReg dst ) { 970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_Set; 972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Set.cond = cond; 973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Set.dst = dst; 974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MfCR ( HReg dst ) 977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_MfCR; 980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MfCR.dst = dst; 981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_MFence ( void ) 984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_MFence; 987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpUnary ( PPCFpOp op, HReg dst, HReg src ) { 991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpUnary; 993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpUnary.op = op; 994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpUnary.dst = dst; 995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpUnary.src = src; 996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpBinary ( PPCFpOp op, HReg dst, 999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpBinary; 1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpBinary.op = op; 1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpBinary.dst = dst; 1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpBinary.srcL = srcL; 1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpBinary.srcR = srcR; 1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpMulAcc ( PPCFpOp op, HReg dst, HReg srcML, 1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcMR, HReg srcAcc ) 1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpMulAcc; 1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.op = op; 1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.dst = dst; 1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.srcML = srcML; 1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.srcMR = srcMR; 1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpMulAcc.srcAcc = srcAcc; 1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpLdSt ( Bool isLoad, UChar sz, 1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg, PPCAMode* addr ) { 1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpLdSt; 1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.isLoad = isLoad; 1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.sz = sz; 1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.reg = reg; 1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.addr = addr; 1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 4 || sz == 8); 1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpSTFIW ( HReg addr, HReg data ) 1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpSTFIW; 1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpSTFIW.addr = addr; 1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpSTFIW.data = data; 1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpRSP ( HReg dst, HReg src ) { 1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpRSP; 1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpRSP.dst = dst; 1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpRSP.src = src; 1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Unary(PPCFpOp op, HReg dst, HReg src) { 1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) ); 1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp64Unary; 1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Unary.op = op; 1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Unary.dst = dst; 1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Unary.src = src; 1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Binary(PPCFpOp op, HReg dst, HReg srcL, HReg srcR) { 1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) ); 1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp64Binary; 1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Binary.op = op; 1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Binary.dst = dst; 1059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Binary.srcL = srcL; 1060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Binary.srcR = srcR; 1061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1063663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpShift ( PPCFpOp op, HReg dst, HReg src, PPCRI* shift ) { 1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpShift; 1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift.op = op; 1067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift.shift = shift; 1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift.src = src; 1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift.dst = dst; 1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1072663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Unary(PPCFpOp op, HReg dst_hi, HReg dst_lo, 1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo) { 1074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) ); 1075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp128Unary; 1076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.op = op; 1077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.dst_hi = dst_hi; 1078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.dst_lo = dst_lo; 1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.src_hi = src_hi; 1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Unary.src_lo = src_lo; 1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Binary(PPCFpOp op, HReg dst_hi, HReg dst_lo, 1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo) { 1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to pass the srcL argument and return the result */ 1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc( sizeof(PPCInstr) ); 1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp128Binary; 1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.op = op; 1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.dst_hi = dst_hi; 1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.dst_lo = dst_lo; 1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.srcR_hi = srcR_hi; 1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Binary.srcR_lo = srcR_lo; 1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpShift128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo, 1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* shift ) { 1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpShift128; 1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.op = op; 1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.shift = shift; 1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.src_hi = src_hi; 1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.src_lo = src_lo; 1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.dst_hi = dst_hi; 1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.dst_lo = dst_lo; 1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpRound ( HReg dst, HReg src, PPCRI* r_rmc ) { 1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpRound; 1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound.dst = dst; 1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound.src = src; 1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound.r_rmc = r_rmc; 1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpRound128 ( HReg dst_hi, HReg dst_lo, HReg src_hi, 1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_lo, PPCRI* r_rmc ) { 1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpRound128; 1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.dst_hi = dst_hi; 1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.dst_lo = dst_lo; 1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.src_hi = src_hi; 1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.src_lo = src_lo; 1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpRound128.r_rmc = r_rmc; 1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpQuantize ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR, 1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCRI* rmc ) { 1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpQuantize; 1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.op = op; 1132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.dst = dst; 1133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.srcL = srcL; 1134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.srcR = srcR; 1135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize.rmc = rmc; 1136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo, PPCRI* rmc ) { 1140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to pass left operand in and return result */ 1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpQuantize128; 1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.op = op; 1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.dst_hi = dst_hi; 1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.dst_lo = dst_lo; 1146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.src_hi = src_hi; 1147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.src_lo = src_lo; 1148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpQuantize128.rmc = rmc; 1149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst, 1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo ) { 1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpD128toD64; 1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpD128toD64.op = op; 1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpD128toD64.src_hi = src_hi; 1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpD128toD64.src_lo = src_lo; 1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpD128toD64.dst = dst; 1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_DfpI64StoD128 ( PPCFpOp op, HReg dst_hi, 1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg dst_lo, HReg src ) { 1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_DfpI64StoD128; 1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpI64StoD128.op = op; 1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpI64StoD128.src = src; 1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpI64StoD128.dst_hi = dst_hi; 1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpI64StoD128.dst_lo = dst_lo; 1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op, HReg dst, 1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src_hi, HReg src_lo ) { 1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to pass the srcL argument */ 1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_ExtractExpD128; 1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.ExtractExpD128.op = op; 1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.ExtractExpD128.dst = dst; 1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.ExtractExpD128.src_hi = src_hi; 1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.ExtractExpD128.src_lo = src_lo; 1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_InsertExpD128 ( PPCFpOp op, HReg dst_hi, HReg dst_lo, 1183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcL, HReg srcR_hi, HReg srcR_lo ) { 1184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to pass the srcL argument */ 1185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_InsertExpD128; 1187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.op = op; 1188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.dst_hi = dst_hi; 1189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.dst_lo = dst_lo; 1190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.srcL = srcL; 1191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.srcR_hi = srcR_hi; 1192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.InsertExpD128.srcR_lo = srcR_lo; 1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1195663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp64Cmp (/* UInt crfD,*/ HReg dst, HReg srcL, HReg srcR ) { 1196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp64Cmp; 1198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Cmp.dst = dst; 1199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Cmp.srcL = srcL; 1200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp64Cmp.srcR = srcR; 1201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1203663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_Dfp128Cmp ( HReg dst, HReg srcL_hi, HReg srcL_lo, 1204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR_hi, HReg srcR_lo ) { 1205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_Dfp128Cmp; 1207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.dst = dst; 1208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.srcL_hi = srcL_hi; 1209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.srcL_lo = srcL_lo; 1210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.srcR_hi = srcR_hi; 1211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.Dfp128Cmp.srcR_lo = srcR_lo; 1212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1214663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_EvCheck ( PPCAMode* amCounter, 1215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCAMode* amFailAddr ) { 1216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_EvCheck; 1218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amCounter = amCounter; 1219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amFailAddr = amFailAddr; 1220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1222663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_ProfInc ( void ) { 1223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Pin_ProfInc; 1225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* 1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovValid combo | fromI | int32 | syned | flt64 | 1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | n n n n | 1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I64U | n n n y | 1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | n n y n | 1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I64S | n n y y | 1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | n y n n | 1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I32U | n y n y | 1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | n y y n | 1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov F64->I32S | n y y y | 1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64U->F32 | y n n n | 1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64U->F64 | y n n y | 1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y n y n | 1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov I64S->F64 | y n y y | 1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y y n n | 1256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y y n y | 1258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y y y n | 1260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | y y y y | 1262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov-------------------------------------------- 1263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/ 1264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned, 1265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool flt64, HReg dst, HReg src ) { 1266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool tmp = fromI | int32 | syned | flt64; 1267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vassert(tmp == True || tmp == False); // iow, no high bits set 1268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UShort conversion = 0; 1269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov conversion = (fromI << 3) | (int32 << 2) | (syned << 1) | flt64; 1270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (conversion) { 1271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // Supported conversion operations 1272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 1: case 3: case 5: case 7: 1273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 8: case 9: case 11: 1274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 1275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov default: 1276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vpanic("PPCInstr_FpCftI(ppc_host)"); 1277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpCftI; 1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCftI.fromI = fromI; 1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCftI.int32 = int32; 1282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov i->Pin.FpCftI.syned = syned; 1283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov i->Pin.FpCftI.flt64 = flt64; 1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCftI.dst = dst; 1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCftI.src = src; 1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpCMov ( PPCCondCode cond, HReg dst, HReg src ) { 1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpCMov; 1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCMov.cond = cond; 1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCMov.dst = dst; 1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCMov.src = src; 1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cond.test != Pct_ALWAYS); 1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1297663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPPCInstr* PPCInstr_FpLdFPSCR ( HReg src, Bool dfp_rm ) { 1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpLdFPSCR; 1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdFPSCR.src = src; 1301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.FpLdFPSCR.dfp_rm = dfp_rm ? 1 : 0; 1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_FpCmp ( HReg dst, HReg srcL, HReg srcR ) { 1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_FpCmp; 1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCmp.dst = dst; 1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCmp.srcL = srcL; 1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpCmp.srcR = srcR; 1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Read/Write Link Register */ 1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_RdWrLR ( Bool wrLR, HReg gpr ) { 1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_RdWrLR; 1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.RdWrLR.wrLR = wrLR; 1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.RdWrLR.gpr = gpr; 1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* AltiVec */ 1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvLdSt ( Bool isLoad, UChar sz, 1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg reg, PPCAMode* addr ) { 1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvLdSt; 1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.isLoad = isLoad; 1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.sz = sz; 1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.reg = reg; 1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.addr = addr; 1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvUnary ( PPCAvOp op, HReg dst, HReg src ) { 1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvUnary; 1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUnary.op = op; 1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUnary.dst = dst; 1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUnary.src = src; 1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBinary ( PPCAvOp op, HReg dst, 1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBinary; 1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBinary.op = op; 1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBinary.dst = dst; 1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBinary.srcL = srcL; 1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBinary.srcR = srcR; 1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin8x16 ( PPCAvOp op, HReg dst, 1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBin8x16; 1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin8x16.op = op; 1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin8x16.dst = dst; 1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin8x16.srcL = srcL; 1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin8x16.srcR = srcR; 1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin16x8 ( PPCAvOp op, HReg dst, 1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBin16x8; 1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin16x8.op = op; 1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin16x8.dst = dst; 1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin16x8.srcL = srcL; 1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin16x8.srcR = srcR; 1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvBin32x4 ( PPCAvOp op, HReg dst, 1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBin32x4; 1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32x4.op = op; 1376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32x4.dst = dst; 1377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32x4.srcL = srcL; 1378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32x4.srcR = srcR; 1379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvBin64x2 ( PPCAvOp op, HReg dst, 1382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg srcL, HReg srcR ) { 1383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = Pin_AvBin64x2; 1385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvBin64x2.op = op; 1386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvBin64x2.dst = dst; 1387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvBin64x2.srcL = srcL; 1388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvBin64x2.srcR = srcR; 1389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, 1393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvBin32Fx4; 1396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32Fx4.op = op; 1397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32Fx4.dst = dst; 1398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32Fx4.srcL = srcL; 1399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvBin32Fx4.srcR = srcR; 1400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovPPCInstr* PPCInstr_AvUn32Fx4 ( PPCAvFpOp op, HReg dst, HReg src ) { 1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvUn32Fx4; 1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUn32Fx4.op = op; 1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUn32Fx4.dst = dst; 1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvUn32Fx4.src = src; 1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvPerm ( HReg dst, HReg srcL, HReg srcR, HReg ctl ) { 1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvPerm; 1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvPerm.dst = dst; 1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvPerm.srcL = srcL; 1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvPerm.srcR = srcR; 1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvPerm.ctl = ctl; 1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvSel ( HReg ctl, HReg dst, HReg srcL, HReg srcR ) { 1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvSel; 1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSel.ctl = ctl; 1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSel.dst = dst; 1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSel.srcL = srcL; 1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSel.srcR = srcR; 1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvShlDbl ( UChar shift, HReg dst, 1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg srcL, HReg srcR ) { 1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvShlDbl; 1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvShlDbl.shift = shift; 1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvShlDbl.dst = dst; 1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvShlDbl.srcL = srcL; 1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvShlDbl.srcR = srcR; 1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvSplat ( UChar sz, HReg dst, PPCVI5s* src ) { 1440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvSplat; 1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSplat.sz = sz; 1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSplat.dst = dst; 1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSplat.src = src; 1445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvCMov ( PPCCondCode cond, HReg dst, HReg src ) { 1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvCMov; 1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvCMov.cond = cond; 1451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvCMov.dst = dst; 1452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvCMov.src = src; 1453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cond.test != Pct_ALWAYS); 1454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownPPCInstr* PPCInstr_AvLdVSCR ( HReg src ) { 1457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->tag = Pin_AvLdVSCR; 1459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdVSCR.src = src; 1460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return i; 1461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvCipherV128Unary ( PPCAvOp op, HReg dst, HReg src ) { 1463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = Pin_AvCipherV128Unary; 1465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvCipherV128Unary.op = op; 1466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvCipherV128Unary.dst = dst; 1467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvCipherV128Unary.src = src; 1468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvCipherV128Binary ( PPCAvOp op, HReg dst, 1471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg srcL, HReg srcR ) { 1472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = Pin_AvCipherV128Binary; 1474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvCipherV128Binary.op = op; 1475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvCipherV128Binary.dst = dst; 1476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvCipherV128Binary.srcL = srcL; 1477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvCipherV128Binary.srcR = srcR; 1478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvHashV128Binary ( PPCAvOp op, HReg dst, 1481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src, PPCRI* s_field ) { 1482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = Pin_AvHashV128Binary; 1484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvHashV128Binary.op = op; 1485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvHashV128Binary.dst = dst; 1486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvHashV128Binary.src = src; 1487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvHashV128Binary.s_field = s_field; 1488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovPPCInstr* PPCInstr_AvBCDV128Trinary ( PPCAvOp op, HReg dst, 1491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src1, HReg src2, PPCRI* ps ) { 1492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); 1493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = Pin_AvBCDV128Trinary; 1494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvBCDV128Trinary.op = op; 1495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvBCDV128Trinary.dst = dst; 1496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvBCDV128Trinary.src1 = src1; 1497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvBCDV128Trinary.src2 = src2; 1498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvBCDV128Trinary.ps = ps; 1499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Pretty Print instructions */ 1504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void ppLoadImm ( HReg dst, ULong imm, Bool mode64 ) { 1505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("li_word "); 1506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(dst); 1507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) { 1508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",0x%08x", (UInt)imm); 1509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",0x%016llx", imm); 1511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void ppMovReg ( HReg dst, HReg src ) { 1515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (hregNumber(dst) != hregNumber(src)) { 1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mr "); 1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(dst); 1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(src); 1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ppPPCInstr ( PPCInstr* i, Bool mode64 ) 1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->tag) { 1526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LI: 1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppLoadImm(i->Pin.LI.dst, i->Pin.LI.imm64, mode64); 1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Alu: { 1530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg r_srcL = i->Pin.Alu.srcL; 1531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* rh_srcR = i->Pin.Alu.srcR; 1532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* special-case "mr" */ 1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Alu.op == Palu_OR && // or Rd,Rs,Rs == mr Rd,Rs 1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rh_srcR->tag == Prh_Reg && 1535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sameHReg(rh_srcR->Prh.Reg.reg, r_srcL)) { 1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mr "); 1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Alu.dst); 1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(r_srcL); 1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* special-case "li" */ 1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Alu.op == Palu_ADD && // addi Rd,0,imm == li Rd,imm 1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rh_srcR->tag == Prh_Imm && 1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown hregNumber(r_srcL) == 0) { 1546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("li "); 1547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Alu.dst); 1548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRH(rh_srcR); 1550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* generic */ 1553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAluOp(i->Pin.Alu.op, 1554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown toBool(rh_srcR->tag == Prh_Imm))); 1555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Alu.dst); 1556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(r_srcL); 1558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRH(rh_srcR); 1560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Shft: { 1563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg r_srcL = i->Pin.Shft.srcL; 1564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* rh_srcR = i->Pin.Shft.srcR; 1565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCShftOp(i->Pin.Shft.op, 1566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown toBool(rh_srcR->tag == Prh_Imm), 1567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Shft.sz32)); 1568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Shft.dst); 1569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(r_srcL); 1571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRH(rh_srcR); 1573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AddSubC: 1576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s%s ", 1577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.isAdd ? "add" : "sub", 1578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AddSubC.setC ? "c" : "e"); 1579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AddSubC.dst); 1580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AddSubC.srcL); 1582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AddSubC.srcR); 1584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Cmp: 1586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s%c%s %%cr%u,", 1587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.syned ? "cmp" : "cmpl", 1588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.sz32 ? 'w' : 'd', 1589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.srcR->tag == Prh_Imm ? "i" : "", 1590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Cmp.crfD); 1591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Cmp.srcL); 1592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRH(i->Pin.Cmp.srcR); 1594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Unary: 1596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCUnaryOp(i->Pin.Unary.op)); 1597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Unary.dst); 1598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Unary.src); 1600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MulL: 1602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mul%c%c%s ", 1603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.hi ? 'h' : 'l', 1604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.sz32 ? 'w' : 'd', 1605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.MulL.hi ? (i->Pin.MulL.syned ? "s" : "u") : ""); 1606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.MulL.dst); 1607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.MulL.srcL); 1609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.MulL.srcR); 1611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Div: 1613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vex_printf("div%c%s%s ", 1614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.sz32 ? 'w' : 'd', 1615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov i->Pin.Div.extended ? "e" : "", 1616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.Div.syned ? "" : "u"); 1617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Div.dst); 1618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Div.srcL); 1620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Div.srcR); 1622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Call: { 1624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int n; 1625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("call: "); 1626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Call.cond.test != Pct_ALWAYS) { 1627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (%s) ", showPPCCondCode(i->Pin.Call.cond)); 1628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("{ "); 1630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppLoadImm(hregPPC_GPR10(mode64), i->Pin.Call.target, mode64); 1631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" ; mtctr r10 ; bctrl ["); 1632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (n = 0; n < 32; n++) { 1633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Call.argiregs & (1<<n)) { 1634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("r%d", n); 1635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((i->Pin.Call.argiregs >> n) > 1) 1636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 1640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppRetLoc(i->Pin.Call.rloc); 1641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("] }"); 1642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 1643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XDirect: 1645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xDirect) "); 1646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (%s) { ", 1647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showPPCCondCode(i->Pin.XDirect.cond)); 1648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 1649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm64 r30,0x%llx; ", i->Pin.XDirect.dstGA); 1650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("std r30,"); 1651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm32 r30,0x%llx; ", i->Pin.XDirect.dstGA); 1653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("stw r30,"); 1654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.XDirect.amCIA); 1656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; "); 1657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 1658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm64-fixed5 r30,$disp_cp_chain_me_to_%sEP; ", 1659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.toFastEP ? "fast" : "slow"); 1660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm32-fixed2 r30,$disp_cp_chain_me_to_%sEP; ", 1662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.toFastEP ? "fast" : "slow"); 1663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mtctr r30; bctrl }"); 1665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XIndir: 1667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xIndir) "); 1668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (%s) { ", 1669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showPPCCondCode(i->Pin.XIndir.cond)); 1670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", mode64 ? "std" : "stw"); 1671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.XIndir.dstGA); 1672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.XIndir.amCIA); 1674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; "); 1675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm%s r30,$disp_cp_xindir; ", mode64 ? "64" : "32"); 1676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mtctr r30; bctr }"); 1677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XAssisted: 1679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xAssisted) "); 1680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (%s) { ", 1681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showPPCCondCode(i->Pin.XAssisted.cond)); 1682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", mode64 ? "std" : "stw"); 1683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.XAssisted.dstGA); 1684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.XAssisted.amCIA); 1686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; "); 1687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("li r31,$IRJumpKind_to_TRCVAL(%d); ", 1688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (Int)i->Pin.XAssisted.jk); 1689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("imm%s r30,$disp_cp_xindir; ", mode64 ? "64" : "32"); 1690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mtctr r30; bctr }"); 1691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_CMov: 1693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("cmov (%s) ", showPPCCondCode(i->Pin.CMov.cond)); 1694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.CMov.dst); 1695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCRI(i->Pin.CMov.src); 1697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": "); 1698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.CMov.cond.test != Pct_ALWAYS) { 1699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (%s) ", showPPCCondCode(i->Pin.CMov.cond)); 1700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("{ "); 1702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.CMov.src->tag == Pri_Imm) { 1703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppLoadImm(i->Pin.CMov.dst, i->Pin.CMov.src->Pri.Imm, mode64); 1704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppMovReg(i->Pin.CMov.dst, i->Pin.CMov.src->Pri.Reg); 1706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Load: { 1710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.Load.src->tag == Pam_RR); 1711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.Load.sz; 1712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HChar c_sz = sz==1 ? 'b' : sz==2 ? 'h' : sz==4 ? 'w' : 'd'; 1713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("l%c%s%s ", c_sz, sz==8 ? "" : "z", idxd ? "x" : "" ); 1714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Load.dst); 1715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCAMode(i->Pin.Load.src); 1717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LoadL: 1720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("l%carx ", i->Pin.LoadL.sz==4 ? 'w' : 'd'); 1721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.LoadL.dst); 1722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",%%r0,"); 1723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.LoadL.src); 1724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Store: { 1726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.Store.sz; 1727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.Store.dst->tag == Pam_RR); 1728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HChar c_sz = sz==1 ? 'b' : sz==2 ? 'h' : sz==4 ? 'w' : /*8*/ 'd'; 1729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("st%c%s ", c_sz, idxd ? "x" : "" ); 1730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Store.src); 1731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCAMode(i->Pin.Store.dst); 1733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_StoreC: 1736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("st%ccx. ", i->Pin.StoreC.sz==4 ? 'w' : 'd'); 1737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.StoreC.src); 1738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",%%r0,"); 1739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.StoreC.dst); 1740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Set: { 1742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cc = i->Pin.Set.cond; 1743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("set (%s),", showPPCCondCode(cc)); 1744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cc.test == Pct_ALWAYS) { 1746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": { li "); 1747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",1 }"); 1749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": { mfcr r0 ; rlwinm "); 1751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",r0,%u,31,31", cc.flag+1); 1753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cc.test == Pct_FALSE) { 1754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("; xori "); 1755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.Set.dst); 1758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",1"); 1759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MfCR: 1765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mfcr "); 1766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.MfCR.dst); 1767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 1768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MFence: 1769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mfence (=sync)"); 1770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpUnary: 1773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCFpOp(i->Pin.FpUnary.op)); 1774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpUnary.dst); 1775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpUnary.src); 1777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpBinary: 1779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCFpOp(i->Pin.FpBinary.op)); 1780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpBinary.dst); 1781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpBinary.srcL); 1783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpBinary.srcR); 1785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpMulAcc: 1787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCFpOp(i->Pin.FpMulAcc.op)); 1788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpMulAcc.dst); 1789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpMulAcc.srcML); 1791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpMulAcc.srcMR); 1793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpMulAcc.srcAcc); 1795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdSt: { 1797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.FpLdSt.sz; 1798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.FpLdSt.addr->tag == Pam_RR); 1799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpLdSt.isLoad) { 1800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("lf%c%s ", 1801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (sz==4 ? 's' : 'd'), 1802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown idxd ? "x" : "" ); 1803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpLdSt.reg); 1804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCAMode(i->Pin.FpLdSt.addr); 1806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 1807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("stf%c%s ", 1808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (sz==4 ? 's' : 'd'), 1809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown idxd ? "x" : "" ); 1810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpLdSt.reg); 1811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCAMode(i->Pin.FpLdSt.addr); 1813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpSTFIW: 1817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("stfiwz "); 1818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpSTFIW.data); 1819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",0("); 1820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpSTFIW.addr); 1821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(")"); 1822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpRSP: 1824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("frsp "); 1825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpRSP.dst); 1826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpRSP.src); 1828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCftI: { 1830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* str = "fc?????"; 1831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Note that "fcfids" is missing from below. That instruction would 1832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * satisfy the predicate: 1833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) 1834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * which would go into a final "else" clause to make this if-else 1835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * block balanced. But we're able to implement fcfids by leveraging 1836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * the fcfid implementation, so it wasn't necessary to include it here. 1837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */ 1838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == False) 1839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) 1840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fctid"; 1841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 1842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fctidu"; 1843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == True) 1844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) 1845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fctiw"; 1846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 1847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fctiwu"; 1848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else if (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) { 1849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) { 1850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fcfid"; 1851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 1852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.flt64 == True) 1853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fcfidu"; 1854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 1855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov str = "fcfidus"; 1856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 1858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", str); 1859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCftI.dst); 1860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCftI.src); 1862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCMov: 1865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("fpcmov (%s) ", showPPCCondCode(i->Pin.FpCMov.cond)); 1866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCMov.dst); 1867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCMov.src); 1869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": "); 1870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (fr_dst != fr_src) { "); 1871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCMov.cond.test != Pct_ALWAYS) { 1872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (%s) { ", showPPCCondCode(i->Pin.FpCMov.cond)); 1873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("fmr "); 1875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCMov.dst); 1876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCMov.src); 1878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCMov.cond.test != Pct_ALWAYS) 1879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 1881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdFPSCR: 1883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mtfsf 0xFF,"); 1884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpLdFPSCR.src); 1885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(",0, %s", i->Pin.FpLdFPSCR.dfp_rm ? "1" : "0"); 1886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCmp: 1888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("fcmpo %%cr1,"); 1889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.srcL); 1890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.srcR); 1892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("; mfcr "); 1893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.dst); 1894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("; rlwinm "); 1895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.dst); 1896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.FpCmp.dst); 1898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",8,28,31"); 1899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_RdWrLR: 1902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", i->Pin.RdWrLR.wrLR ? "mtlr" : "mflr"); 1903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.RdWrLR.gpr); 1904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 1906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdSt: { 1907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.AvLdSt.sz; 1908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* str_size; 1909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvLdSt.addr->tag == Pam_IR) { 1910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppLoadImm(hregPPC_GPR30(mode64), 1911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Pin.AvLdSt.addr->Pam.IR.index, mode64); 1912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" ; "); 1913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown str_size = sz==1 ? "eb" : sz==2 ? "eh" : sz==4 ? "ew" : ""; 1915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvLdSt.isLoad) 1916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("lv%sx ", str_size); 1917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 1918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("stv%sx ", str_size); 1919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvLdSt.reg); 1920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvLdSt.addr->tag == Pam_IR) 1922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%%r30"); 1923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 1924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvLdSt.addr->Pam.RR.index); 1925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvLdSt.addr->Pam.RR.base); 1927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 1929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUnary: 1930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAvOp(i->Pin.AvUnary.op)); 1931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvUnary.dst); 1932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvUnary.src); 1934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBinary: 1936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAvOp(i->Pin.AvBinary.op)); 1937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBinary.dst); 1938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBinary.srcL); 1940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBinary.srcR); 1942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin8x16: 1944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s(b) ", showPPCAvOp(i->Pin.AvBin8x16.op)); 1945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin8x16.dst); 1946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin8x16.srcL); 1948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin8x16.srcR); 1950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin16x8: 1952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s(h) ", showPPCAvOp(i->Pin.AvBin16x8.op)); 1953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin16x8.dst); 1954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin16x8.srcL); 1956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin16x8.srcR); 1958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32x4: 1960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvBin32x4.op)); 1961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32x4.dst); 1962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32x4.srcL); 1964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32x4.srcR); 1966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvBin64x2: 1968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvBin64x2.op)); 1969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvBin64x2.dst); 1970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 1971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvBin64x2.srcL); 1972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 1973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvBin64x2.srcR); 1974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32Fx4: 1976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAvFpOp(i->Pin.AvBin32Fx4.op)); 1977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32Fx4.dst); 1978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32Fx4.srcL); 1980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvBin32Fx4.srcR); 1982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUn32Fx4: 1984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("%s ", showPPCAvFpOp(i->Pin.AvUn32Fx4.op)); 1985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvUn32Fx4.dst); 1986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvUn32Fx4.src); 1988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvPerm: 1990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vperm "); 1991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvPerm.dst); 1992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvPerm.srcL); 1994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvPerm.srcR); 1996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 1997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvPerm.ctl); 1998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 1999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSel: 2001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vsel "); 2002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSel.dst); 2003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 2004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSel.srcL); 2005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 2006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSel.srcR); 2007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 2008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSel.ctl); 2009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvShlDbl: 2012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vsldoi "); 2013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvShlDbl.dst); 2014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 2015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvShlDbl.srcL); 2016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 2017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvShlDbl.srcR); 2018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(",%d", i->Pin.AvShlDbl.shift); 2019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSplat: { 2022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.AvSplat.sz; 2023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HChar ch_sz = toUChar( (sz == 8) ? 'b' : (sz == 16) ? 'h' : 'w' ); 2024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vsplt%s%c ", 2025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvSplat.src->tag == Pvi_Imm ? "is" : "", ch_sz); 2026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvSplat.dst); 2027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 2028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCVI5s(i->Pin.AvSplat.src); 2029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvSplat.src->tag == Pvi_Reg) 2030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(", %d", (128/sz)-1); /* louis lane */ 2031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvCMov: 2035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("avcmov (%s) ", showPPCCondCode(i->Pin.AvCMov.cond)); 2036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvCMov.dst); 2037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 2038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvCMov.src); 2039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(": "); 2040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (v_dst != v_src) { "); 2041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvCMov.cond.test != Pct_ALWAYS) { 2042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("if (%s) { ", showPPCCondCode(i->Pin.AvCMov.cond)); 2043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("vmr "); 2045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvCMov.dst); 2046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(","); 2047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvCMov.src); 2048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCMov.cond.test != Pct_ALWAYS) 2049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 2050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf(" }"); 2051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdVSCR: 2054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("mtvscr "); 2055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegPPC(i->Pin.AvLdVSCR.src); 2056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvCipherV128Unary: 2059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvCipherV128Unary.op)); 2060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvCipherV128Unary.dst); 2061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvCipherV128Unary.src); 2063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvCipherV128Binary: 2066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvCipherV128Binary.op)); 2067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvCipherV128Binary.dst); 2068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvCipherV128Binary.srcL); 2070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvCipherV128Binary.srcR); 2072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvHashV128Binary: 2075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvHashV128Binary.op)); 2076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvHashV128Binary.dst); 2077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvHashV128Binary.src); 2079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppPPCRI(i->Pin.AvHashV128Binary.s_field); 2081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvBCDV128Trinary: 2084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s(w) ", showPPCAvOp(i->Pin.AvBCDV128Trinary.op)); 2085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvBCDV128Trinary.dst); 2086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvBCDV128Trinary.src1); 2088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegPPC(i->Pin.AvBCDV128Trinary.src2); 2090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 2091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppPPCRI(i->Pin.AvBCDV128Trinary.ps); 2092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Unary: 2095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.Dfp64Unary.op)); 2096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Unary.dst); 2097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Unary.src); 2099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Binary: 2102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.Dfp64Binary.op)); 2103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Binary.dst); 2104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Binary.srcL); 2106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Binary.srcR); 2108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift: 2111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpShift.op)); 2112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpShift.dst); 2113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpShift.src); 2115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpShift.shift); 2117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Unary: 2120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.Dfp128Unary.op)); 2121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Unary.dst_hi); 2122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Unary.src_hi); 2124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Binary: 2127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.Dfp128Binary.op)); 2128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Binary.dst_hi); 2129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Binary.srcR_hi); 2131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift128: 2134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpShift128.op)); 2135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpShift128.dst_hi); 2136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpShift128.src_hi); 2138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpShift128.shift); 2140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound: 2143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("drintx "); 2144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpRound.dst); 2145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpRound.src); 2147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpRound.r_rmc); /* R in bit 3 and RMC in bits 2:0 */ 2149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound128: 2152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("drintxq "); 2153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpRound128.dst_hi); 2154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpRound128.src_hi); 2156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpRound128.r_rmc); /* R in bit 3 and RMC in bits 2:0 */ 2158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize: 2161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpQuantize.op)); 2162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize.dst); 2163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize.srcL); 2165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize.srcR); 2167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpQuantize.rmc); 2169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize128: 2172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Dst is used to pass in left source and return result */ 2173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("dquaq "); 2174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize128.dst_hi); 2175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize128.dst_hi); 2177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpQuantize128.src_hi); 2179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCRI(i->Pin.DfpQuantize128.rmc); 2181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpD128toD64: 2184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpD128toD64.op)); 2185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpD128toD64.dst); 2186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpD128toD64.src_hi); 2188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpI64StoD128: 2192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showPPCFpOp(i->Pin.DfpI64StoD128.op)); 2193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpI64StoD128.dst_hi); 2194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.DfpI64StoD128.src); 2196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ExtractExpD128: 2199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("dxexq "); 2200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.ExtractExpD128.dst); 2201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.ExtractExpD128.src_hi); 2203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_InsertExpD128: 2205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("diexq "); 2206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.InsertExpD128.dst_hi); 2207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.InsertExpD128.srcL); 2209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.InsertExpD128.srcR_hi); 2211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Cmp: 2213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("dcmpo %%cr1,"); 2214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.srcL); 2215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.srcR); 2217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; mfcr "); 2218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.dst); 2219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; rlwinm "); 2220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.dst); 2221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp64Cmp.dst); 2223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(",8,28,31"); 2224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Cmp: 2226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("dcmpoq %%cr1,"); 2227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.srcL_hi); 2228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.srcR_hi); 2230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; mfcr "); 2231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.dst); 2232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; rlwinm "); 2233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.dst); 2234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 2235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegPPC(i->Pin.Dfp128Cmp.dst); 2236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(",8,28,31"); 2237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_EvCheck: 2239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Note that the counter dec is 32 bit even in 64-bit mode. */ 2240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(evCheck) "); 2241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("lwz r30,"); 2242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.EvCheck.amCounter); 2243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; addic. r30,r30,-1; "); 2244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("stw r30,"); 2245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.EvCheck.amCounter); 2246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; bge nofail; lwz r30,"); 2247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppPPCAMode(i->Pin.EvCheck.amFailAddr); 2248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; mtctr r30; bctr; nofail:"); 2249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ProfInc: 2251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 2252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(profInc) imm64-fixed5 r30,$NotKnownYet; "); 2253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ld r29,(r30); addi r29,r29,1; std r29,(r30)"); 2254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(profInc) imm32-fixed2 r30,$NotKnownYet; "); 2256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("lwz r29,4(r30); addic. r29,r29,1; stw r29,4(r30)"); 2257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("lwz r29,0(r30); addze r29,r29; stw r29,0(r30)"); 2258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 2261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("\nppPPCInstr: No such tag(%d)\n", (Int)i->tag); 2262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("ppPPCInstr"); 2263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- Helpers for register allocation. --------- */ 2267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid getRegUsage_PPCInstr ( HRegUsage* u, PPCInstr* i, Bool mode64 ) 2269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown initHRegUsage(u); 2271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->tag) { 2272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LI: 2273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.LI.dst); 2274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 2275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Alu: 2276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Alu.srcL); 2277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCRH(u, i->Pin.Alu.srcR); 2278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Alu.dst); 2279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Shft: 2281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Shft.srcL); 2282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCRH(u, i->Pin.Shft.srcR); 2283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Shft.dst); 2284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AddSubC: 2286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AddSubC.dst); 2287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AddSubC.srcL); 2288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AddSubC.srcR); 2289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Cmp: 2291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Cmp.srcL); 2292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCRH(u, i->Pin.Cmp.srcR); 2293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Unary: 2295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Unary.dst); 2296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Unary.src); 2297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MulL: 2299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.MulL.dst); 2300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.MulL.srcL); 2301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.MulL.srcR); 2302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Div: 2304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Div.dst); 2305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Div.srcL); 2306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Div.srcR); 2307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Call: { 2309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt argir; 2310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* This is a bit subtle. */ 2311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* First off, claim it trashes all the caller-saved regs 2312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown which fall within the register allocator's jurisdiction. 2313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown These I believe to be: 2314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mode32: r3 to r12 2315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mode64: r3 to r10 2316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 2317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* XXXXXXXXXXXXXXXXX BUG! This doesn't say anything about the FP 2318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown or Altivec registers. We get away with this ONLY because 2319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown getAllocatableRegs_PPC gives the allocator callee-saved fp 2320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and Altivec regs, and no caller-save ones. */ 2321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR3(mode64)); 2322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR4(mode64)); 2323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR5(mode64)); 2324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR6(mode64)); 2325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR7(mode64)); 2326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR8(mode64)); 2327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR9(mode64)); 2328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR10(mode64)); 2329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) { 2330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR11(mode64)); 2331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR12(mode64)); 2332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Now we have to state any parameter-carrying registers 2335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown which might be read. This depends on the argiregs field. */ 2336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown argir = i->Pin.Call.argiregs; 2337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir &(1<<10)) addHRegUse(u, HRmRead, hregPPC_GPR10(mode64)); 2338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<9)) addHRegUse(u, HRmRead, hregPPC_GPR9(mode64)); 2339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<8)) addHRegUse(u, HRmRead, hregPPC_GPR8(mode64)); 2340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<7)) addHRegUse(u, HRmRead, hregPPC_GPR7(mode64)); 2341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<6)) addHRegUse(u, HRmRead, hregPPC_GPR6(mode64)); 2342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<5)) addHRegUse(u, HRmRead, hregPPC_GPR5(mode64)); 2343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<4)) addHRegUse(u, HRmRead, hregPPC_GPR4(mode64)); 2344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argir & (1<<3)) addHRegUse(u, HRmRead, hregPPC_GPR3(mode64)); 2345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (argir & ~((1<<3)|(1<<4)|(1<<5)|(1<<6) 2347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown |(1<<7)|(1<<8)|(1<<9)|(1<<10)))); 2348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Finally, there is the issue that the insn trashes a 2350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown register because the literal target address has to be 2351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown loaded into a register. %r10 seems a suitable victim. 2352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Can't use %r0, as some insns interpret it as value zero). */ 2353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR10(mode64)); 2354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Upshot of this is that the assembler really must use %r10, 2355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and no other, as a destination temporary. */ 2356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* XDirect/XIndir/XAssisted are also a bit subtle. They 2359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng conditionally exit the block. Hence we only need to list (1) 2360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng the registers that they read, and (2) the registers that they 2361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng write in the case where the block is not exited. (2) is empty, 2362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng hence only (1) is relevant here. */ 2363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XDirect: 2364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.XDirect.amCIA); 2365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XIndir: 2367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.XIndir.dstGA); 2368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.XIndir.amCIA); 2369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XAssisted: 2371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.XAssisted.dstGA); 2372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.XAssisted.amCIA); 2373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_CMov: 2375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCRI(u, i->Pin.CMov.src); 2376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.CMov.dst); 2377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Load: 2379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCAMode(u, i->Pin.Load.src); 2380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Load.dst); 2381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LoadL: 2383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.LoadL.src); 2384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.LoadL.dst); 2385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Store: 2387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.Store.src); 2388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCAMode(u, i->Pin.Store.dst); 2389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_StoreC: 2391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.StoreC.src); 2392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.StoreC.dst); 2393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Set: 2395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.Set.dst); 2396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MfCR: 2398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.MfCR.dst); 2399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MFence: 2401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpUnary: 2404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpUnary.dst); 2405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpUnary.src); 2406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpBinary: 2408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpBinary.dst); 2409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpBinary.srcL); 2410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpBinary.srcR); 2411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpMulAcc: 2413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpMulAcc.dst); 2414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpMulAcc.srcML); 2415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpMulAcc.srcMR); 2416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpMulAcc.srcAcc); 2417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdSt: 2419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, (i->Pin.FpLdSt.isLoad ? HRmWrite : HRmRead), 2420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.FpLdSt.reg); 2421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCAMode(u, i->Pin.FpLdSt.addr); 2422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpSTFIW: 2424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpSTFIW.addr); 2425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpSTFIW.data); 2426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpRSP: 2428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpRSP.dst); 2429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpRSP.src); 2430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCftI: 2432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpCftI.dst); 2433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpCftI.src); 2434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCMov: 2436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmModify, i->Pin.FpCMov.dst); 2437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpCMov.src); 2438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdFPSCR: 2440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpLdFPSCR.src); 2441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCmp: 2443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.FpCmp.dst); 2444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpCmp.srcL); 2445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.FpCmp.srcR); 2446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_RdWrLR: 2449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, (i->Pin.RdWrLR.wrLR ? HRmRead : HRmWrite), 2450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.RdWrLR.gpr); 2451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdSt: 2454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, (i->Pin.AvLdSt.isLoad ? HRmWrite : HRmRead), 2455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.reg); 2456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvLdSt.addr->tag == Pam_IR) 2457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64)); 2458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCAMode(u, i->Pin.AvLdSt.addr); 2459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUnary: 2461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvUnary.dst); 2462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvUnary.src); 2463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBinary: 2465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvBinary.op == Pav_XOR 2466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && sameHReg(i->Pin.AvBinary.dst, i->Pin.AvBinary.srcL) 2467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && sameHReg(i->Pin.AvBinary.dst, i->Pin.AvBinary.srcR)) { 2468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* reg-alloc needs to understand 'xor r,r,r' as a write of r */ 2469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* (as opposed to a rite of passage :-) */ 2470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBinary.dst); 2471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 2472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBinary.dst); 2473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBinary.srcL); 2474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBinary.srcR); 2475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin8x16: 2478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBin8x16.dst); 2479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin8x16.srcL); 2480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin8x16.srcR); 2481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin16x8: 2483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBin16x8.dst); 2484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin16x8.srcL); 2485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin16x8.srcR); 2486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32x4: 2488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBin32x4.dst); 2489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin32x4.srcL); 2490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin32x4.srcR); 2491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvBin64x2: 2493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->Pin.AvBin64x2.dst); 2494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Pin.AvBin64x2.srcL); 2495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Pin.AvBin64x2.srcR); 2496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32Fx4: 2498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvBin32Fx4.dst); 2499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin32Fx4.srcL); 2500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvBin32Fx4.srcR); 2501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvBin32Fx4.op == Pavfp_MULF) 2502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, hregPPC_VR29()); 2503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUn32Fx4: 2505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvUn32Fx4.dst); 2506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvUn32Fx4.src); 2507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvPerm: 2509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvPerm.dst); 2510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvPerm.srcL); 2511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvPerm.srcR); 2512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvPerm.ctl); 2513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSel: 2515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvSel.dst); 2516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvSel.ctl); 2517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvSel.srcL); 2518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvSel.srcR); 2519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvShlDbl: 2521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvShlDbl.dst); 2522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvShlDbl.srcL); 2523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvShlDbl.srcR); 2524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSplat: 2526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmWrite, i->Pin.AvSplat.dst); 2527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addRegUsage_PPCVI5s(u, i->Pin.AvSplat.src); 2528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvCMov: 2530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmModify, i->Pin.AvCMov.dst); 2531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvCMov.src); 2532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdVSCR: 2534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addHRegUse(u, HRmRead, i->Pin.AvLdVSCR.src); 2535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvCipherV128Unary: 2537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->Pin.AvCipherV128Unary.dst); 2538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Pin.AvCipherV128Unary.src); 2539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvCipherV128Binary: 2541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->Pin.AvCipherV128Binary.dst); 2542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Pin.AvCipherV128Binary.srcL); 2543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Pin.AvCipherV128Binary.srcR); 2544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvHashV128Binary: 2546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->Pin.AvHashV128Binary.dst); 2547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Pin.AvHashV128Binary.src); 2548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_PPCRI(u, i->Pin.AvHashV128Binary.s_field); 2549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvBCDV128Trinary: 2551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->Pin.AvBCDV128Trinary.dst); 2552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Pin.AvBCDV128Trinary.src1); 2553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Pin.AvBCDV128Trinary.src2); 2554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_PPCRI(u, i->Pin.AvBCDV128Trinary.ps); 2555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Unary: 2557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp64Unary.dst); 2558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Unary.src); 2559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Binary: 2561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp64Binary.dst); 2562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Binary.srcL); 2563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Binary.srcR); 2564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift: 2566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCRI(u, i->Pin.DfpShift.shift); 2567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift.src); 2568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift.dst); 2569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Unary: 2571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Unary.dst_hi); 2572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Unary.dst_lo); 2573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Unary.src_hi); 2574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Unary.src_lo); 2575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Binary: 2577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Binary.dst_hi); 2578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Binary.dst_lo); 2579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Binary.srcR_hi); 2580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Binary.srcR_lo); 2581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound: 2583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpRound.dst); 2584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpRound.src); 2585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound128: 2587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpRound128.dst_hi); 2588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpRound128.dst_lo); 2589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpRound128.src_hi); 2590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpRound128.src_lo); 2591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize: 2593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCRI(u, i->Pin.DfpQuantize.rmc); 2594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpQuantize.dst); 2595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpQuantize.srcL); 2596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpQuantize.srcR); 2597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize128: 2599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpQuantize128.dst_hi); 2600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpQuantize128.dst_lo); 2601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpQuantize128.src_hi); 2602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.DfpQuantize128.src_lo); 2603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift128: 2605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCRI(u, i->Pin.DfpShift128.shift); 2606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift128.src_hi); 2607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift128.src_lo); 2608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift128.dst_hi); 2609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpShift128.dst_lo); 2610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpD128toD64: 2612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.src_hi); 2613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.src_lo); 2614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpD128toD64.dst); 2615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpI64StoD128: 2617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.src); 2618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.dst_hi); 2619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.DfpI64StoD128.dst_lo); 2620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ExtractExpD128: 2622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.ExtractExpD128.dst); 2623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.ExtractExpD128.src_hi); 2624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.ExtractExpD128.src_lo); 2625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_InsertExpD128: 2627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.InsertExpD128.dst_hi); 2628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.InsertExpD128.dst_lo); 2629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.InsertExpD128.srcL); 2630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.InsertExpD128.srcR_hi); 2631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.InsertExpD128.srcR_lo); 2632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Cmp: 2634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp64Cmp.dst); 2635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Cmp.srcL); 2636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp64Cmp.srcR); 2637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Cmp: 2639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Pin.Dfp128Cmp.dst); 2640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Cmp.srcL_hi); 2641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Cmp.srcL_lo); 2642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Cmp.srcR_hi); 2643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Pin.Dfp128Cmp.srcR_lo); 2644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_EvCheck: 2646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We expect both amodes only to mention the GSP (r31), so this 2647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng is in fact pointless, since GSP isn't allocatable, but 2648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng anyway.. */ 2649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.EvCheck.amCounter); 2650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_PPCAMode(u, i->Pin.EvCheck.amFailAddr); 2651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64)); /* also unavail to RA */ 2652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ProfInc: 2654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregPPC_GPR29(mode64)); 2655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregPPC_GPR30(mode64)); 2656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 2658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCInstr(i, mode64); 2659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("getRegUsage_PPCInstr"); 2660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* local helper */ 2664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void mapReg( HRegRemap* m, HReg* r ) 2665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *r = lookupHRegRemap(m, *r); 2667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid mapRegs_PPCInstr ( HRegRemap* m, PPCInstr* i, Bool mode64 ) 2670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->tag) { 2672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LI: 2673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.LI.dst); 2674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Alu: 2676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Alu.dst); 2677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Alu.srcL); 2678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCRH(m, i->Pin.Alu.srcR); 2679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Shft: 2681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Shft.dst); 2682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Shft.srcL); 2683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCRH(m, i->Pin.Shft.srcR); 2684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AddSubC: 2686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AddSubC.dst); 2687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AddSubC.srcL); 2688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AddSubC.srcR); 2689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Cmp: 2691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Cmp.srcL); 2692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCRH(m, i->Pin.Cmp.srcR); 2693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Unary: 2695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Unary.dst); 2696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Unary.src); 2697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MulL: 2699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.MulL.dst); 2700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.MulL.srcL); 2701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.MulL.srcR); 2702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Div: 2704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Div.dst); 2705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Div.srcL); 2706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Div.srcR); 2707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Call: 2709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XDirect: 2711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.XDirect.amCIA); 2712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XIndir: 2714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.XIndir.dstGA); 2715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.XIndir.amCIA); 2716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XAssisted: 2718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.XAssisted.dstGA); 2719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.XAssisted.amCIA); 2720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_CMov: 2722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCRI(m, i->Pin.CMov.src); 2723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.CMov.dst); 2724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Load: 2726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCAMode(m, i->Pin.Load.src); 2727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Load.dst); 2728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LoadL: 2730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.LoadL.src); 2731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.LoadL.dst); 2732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Store: 2734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Store.src); 2735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCAMode(m, i->Pin.Store.dst); 2736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_StoreC: 2738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.StoreC.src); 2739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.StoreC.dst); 2740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Set: 2742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.Set.dst); 2743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MfCR: 2745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.MfCR.dst); 2746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MFence: 2748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpUnary: 2750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpUnary.dst); 2751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpUnary.src); 2752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpBinary: 2754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpBinary.dst); 2755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpBinary.srcL); 2756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpBinary.srcR); 2757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpMulAcc: 2759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpMulAcc.dst); 2760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpMulAcc.srcML); 2761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpMulAcc.srcMR); 2762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpMulAcc.srcAcc); 2763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdSt: 2765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpLdSt.reg); 2766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCAMode(m, i->Pin.FpLdSt.addr); 2767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpSTFIW: 2769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpSTFIW.addr); 2770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpSTFIW.data); 2771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpRSP: 2773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpRSP.dst); 2774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpRSP.src); 2775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCftI: 2777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCftI.dst); 2778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCftI.src); 2779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCMov: 2781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCMov.dst); 2782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCMov.src); 2783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdFPSCR: 2785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpLdFPSCR.src); 2786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCmp: 2788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCmp.dst); 2789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCmp.srcL); 2790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.FpCmp.srcR); 2791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_RdWrLR: 2793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.RdWrLR.gpr); 2794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdSt: 2796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvLdSt.reg); 2797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCAMode(m, i->Pin.AvLdSt.addr); 2798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUnary: 2800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvUnary.dst); 2801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvUnary.src); 2802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBinary: 2804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBinary.dst); 2805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBinary.srcL); 2806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBinary.srcR); 2807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin8x16: 2809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin8x16.dst); 2810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin8x16.srcL); 2811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin8x16.srcR); 2812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin16x8: 2814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin16x8.dst); 2815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin16x8.srcL); 2816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin16x8.srcR); 2817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32x4: 2819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32x4.dst); 2820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32x4.srcL); 2821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32x4.srcR); 2822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvBin64x2: 2824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvBin64x2.dst); 2825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvBin64x2.srcL); 2826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvBin64x2.srcR); 2827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32Fx4: 2829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32Fx4.dst); 2830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32Fx4.srcL); 2831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvBin32Fx4.srcR); 2832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUn32Fx4: 2834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvUn32Fx4.dst); 2835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvUn32Fx4.src); 2836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvPerm: 2838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvPerm.dst); 2839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvPerm.srcL); 2840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvPerm.srcR); 2841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvPerm.ctl); 2842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSel: 2844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSel.dst); 2845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSel.srcL); 2846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSel.srcR); 2847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSel.ctl); 2848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvShlDbl: 2850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvShlDbl.dst); 2851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvShlDbl.srcL); 2852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvShlDbl.srcR); 2853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSplat: 2855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvSplat.dst); 2856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapRegs_PPCVI5s(m, i->Pin.AvSplat.src); 2857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvCMov: 2859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvCMov.dst); 2860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvCMov.src); 2861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdVSCR: 2863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mapReg(m, &i->Pin.AvLdVSCR.src); 2864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 2865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvCipherV128Unary: 2866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvCipherV128Unary.dst); 2867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvCipherV128Unary.src); 2868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvCipherV128Binary: 2870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvCipherV128Binary.dst); 2871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvCipherV128Binary.srcL); 2872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvCipherV128Binary.srcR); 2873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvHashV128Binary: 2875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_PPCRI(m, i->Pin.AvHashV128Binary.s_field); 2876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvHashV128Binary.dst); 2877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvHashV128Binary.src); 2878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvBCDV128Trinary: 2880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvBCDV128Trinary.dst); 2881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvBCDV128Trinary.src1); 2882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Pin.AvBCDV128Trinary.src2); 2883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_PPCRI(m, i->Pin.AvBCDV128Trinary.ps); 2884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Unary: 2886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Unary.dst); 2887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Unary.src); 2888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Binary: 2890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Binary.dst); 2891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Binary.srcL); 2892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Binary.srcR); 2893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift: 2895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCRI(m, i->Pin.DfpShift.shift); 2896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift.src); 2897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift.dst); 2898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Unary: 2900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Unary.dst_hi); 2901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Unary.dst_lo); 2902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Unary.src_hi); 2903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Unary.src_lo); 2904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Binary: 2906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Binary.dst_hi); 2907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Binary.dst_lo); 2908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Binary.srcR_hi); 2909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Binary.srcR_lo); 2910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift128: 2912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCRI(m, i->Pin.DfpShift128.shift); 2913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift128.src_hi); 2914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift128.src_lo); 2915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift128.dst_hi); 2916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpShift128.dst_lo); 2917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound: 2919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound.dst); 2920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound.src); 2921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound128: 2923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound128.dst_hi); 2924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound128.dst_lo); 2925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound128.src_hi); 2926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpRound128.src_lo); 2927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize: 2929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCRI(m, i->Pin.DfpQuantize.rmc); 2930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize.dst); 2931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize.srcL); 2932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize.srcR); 2933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize128: 2935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCRI(m, i->Pin.DfpQuantize128.rmc); 2936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize128.dst_hi); 2937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize128.dst_lo); 2938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize128.src_hi); 2939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpQuantize128.src_lo); 2940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpD128toD64: 2942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpD128toD64.src_hi); 2943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpD128toD64.src_lo); 2944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpD128toD64.dst); 2945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpI64StoD128: 2947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpI64StoD128.src); 2948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpI64StoD128.dst_hi); 2949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.DfpI64StoD128.dst_lo); 2950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ExtractExpD128: 2952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.ExtractExpD128.dst); 2953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.ExtractExpD128.src_hi); 2954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.ExtractExpD128.src_lo); 2955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_InsertExpD128: 2957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.dst_hi); 2958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.dst_lo); 2959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.srcL); 2960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.srcR_hi); 2961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.InsertExpD128.srcR_lo); 2962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Cmp: 2964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Cmp.dst); 2965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Cmp.srcL); 2966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp64Cmp.srcR); 2967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Cmp: 2969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.dst); 2970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.srcL_hi); 2971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.srcL_lo); 2972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.srcR_hi); 2973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Pin.Dfp128Cmp.srcR_lo); 2974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_EvCheck: 2976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We expect both amodes only to mention the GSP (r31), so this 2977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng is in fact pointless, since GSP isn't allocatable, but 2978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng anyway.. */ 2979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.EvCheck.amCounter); 2980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_PPCAMode(m, i->Pin.EvCheck.amFailAddr); 2981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ProfInc: 2983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* hardwires r29 and r30 -- nothing to modify. */ 2984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 2986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCInstr(i, mode64); 2987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("mapRegs_PPCInstr"); 2988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 2989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 2990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Figure out if i represents a reg-reg move, and if so assign the 2992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown source and destination to *src and *dst. If in doubt say No. Used 2993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown by the register allocator to do move coalescing. 2994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 2995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool isMove_PPCInstr ( PPCInstr* i, HReg* src, HReg* dst ) 2996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 2997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Moves between integer regs */ 2998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->tag == Pin_Alu) { 2999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // or Rd,Rs,Rs == mr Rd,Rs 3000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Alu.op != Palu_OR) 3001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 3002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.Alu.srcR->tag != Prh_Reg) 3003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 3004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (! sameHReg(i->Pin.Alu.srcR->Prh.Reg.reg, i->Pin.Alu.srcL)) 3005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 3006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *src = i->Pin.Alu.srcL; 3007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *dst = i->Pin.Alu.dst; 3008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return True; 3009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Moves between FP regs */ 3011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->tag == Pin_FpUnary) { 3012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpUnary.op != Pfp_MOV) 3013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 3014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *src = i->Pin.FpUnary.src; 3015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *dst = i->Pin.FpUnary.dst; 3016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return True; 3017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return False; 3019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Generate ppc spill/reload instructions under the direction of the 3023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown register allocator. Note it's critical these don't write the 3024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown condition codes. */ 3025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid genSpill_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 3027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg rreg, Int offsetB, Bool mode64 ) 3028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am; 3030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(rreg)); 3031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = *i2 = NULL; 3032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am = PPCAMode_IR( offsetB, GuestStatePtr(mode64) ); 3033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (hregClass(rreg)) { 3034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt64: 3035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 3036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_Store( 8, am, rreg, mode64 ); 3037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 3038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt32: 3039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!mode64); 3040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_Store( 4, am, rreg, mode64 ); 3041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 3042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcFlt64: 3043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_FpLdSt ( False/*store*/, 8, rreg, am ); 3044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 3045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcVec128: 3046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: GPR30 used as spill register to kludge AltiVec 3047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // AMode_IR 3048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_AvLdSt ( False/*store*/, 16, rreg, am ); 3049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 3050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 3051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegClass(hregClass(rreg)); 3052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("genSpill_PPC: unimplemented regclass"); 3053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2, 3057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HReg rreg, Int offsetB, Bool mode64 ) 3058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am; 3060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(rreg)); 3061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = *i2 = NULL; 3062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown am = PPCAMode_IR( offsetB, GuestStatePtr(mode64) ); 3063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (hregClass(rreg)) { 3064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt64: 3065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 3066ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_Load( 8, rreg, am, mode64 ); 3067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 3068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcInt32: 3069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!mode64); 3070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_Load( 4, rreg, am, mode64 ); 3071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 3072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcFlt64: 3073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_FpLdSt ( True/*load*/, 8, rreg, am ); 3074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 3075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case HRcVec128: 3076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // XXX: GPR30 used as spill register to kludge AltiVec AMode_IR 3077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *i1 = PPCInstr_AvLdSt ( True/*load*/, 16, rreg, am ); 3078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 3079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 3080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppHRegClass(hregClass(rreg)); 3081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("genReload_PPC: unimplemented regclass"); 3082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------- The ppc assembler (bleh.) --------- */ 3087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt iregNo ( HReg r, Bool mode64 ) 3089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n; 3091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(hregClass(r) == mode64 ? HRcInt64 : HRcInt32); 3092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(r)); 3093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown n = hregNumber(r); 3094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n <= 32); 3095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return n; 3096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt fregNo ( HReg fr ) 3099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n; 3101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(hregClass(fr) == HRcFlt64); 3102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(fr)); 3103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown n = hregNumber(fr); 3104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n <= 32); 3105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return n; 3106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt vregNo ( HReg v ) 3109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n; 3111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(hregClass(v) == HRcVec128); 3112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!hregIsVirtual(v)); 3113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown n = hregNumber(v); 3114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n <= 32); 3115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return n; 3116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Emit an instruction big-endianly */ 3119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* emit32 ( UChar* p, UInt w32 ) 3120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *p++ = toUChar((w32 >> 24) & 0x000000FF); 3122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *p++ = toUChar((w32 >> 16) & 0x000000FF); 3123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *p++ = toUChar((w32 >> 8) & 0x000000FF); 3124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *p++ = toUChar((w32) & 0x000000FF); 3125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 3126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Fetch an instruction big-endianly */ 3129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt fetch32 ( UChar* p ) 3130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt w32 = 0; 3132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[0]) << 24); 3133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[1]) << 16); 3134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[2]) << 8); 3135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[3]) << 0); 3136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return w32; 3137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The following mkForm[...] functions refer to ppc instruction forms 3140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown as per PPC32 p576 3141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 3142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormD ( UChar* p, UInt opc1, 3144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r1, UInt r2, UInt imm ) 3145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm = imm & 0xFFFF; 3151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (imm)); 3152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormMD ( UChar* p, UInt opc1, UInt r1, UInt r2, 3156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt imm1, UInt imm2, UInt opc2 ) 3157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(imm1 < 0x40); 3163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(imm2 < 0x40); 3164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x08); 3165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm2 = ((imm2 & 0x1F) << 1) | (imm2 >> 5); 3166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ((imm1 & 0x1F)<<11) | (imm2<<5) | 3168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (opc2<<2) | ((imm1 >> 5)<<1)); 3169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormX ( UChar* p, UInt opc1, UInt r1, UInt r2, 3173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt opc2, UInt b0 ) 3174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2); 3182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r3<<11) | (opc2<<1) | (b0)); 3184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXO ( UChar* p, UInt opc1, UInt r1, UInt r2, 3188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt b10, UInt opc2, UInt b0 ) 3189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b10 < 0x2); 3196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x200); 3197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2); 3198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r3<<11) | (b10 << 10) | (opc2<<1) | (b0)); 3200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXL ( UChar* p, UInt opc1, UInt f1, UInt f2, 3204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt f3, UInt opc2, UInt b0 ) 3205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f1 < 0x20); 3209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f2 < 0x20); 3210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f3 < 0x20); 3211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2); 3213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (f1<<21) | (f2<<16) | 3214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (f3<<11) | (opc2<<1) | (b0)); 3215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Note: for split field ops, give mnemonic arg 3219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXFX ( UChar* p, UInt r1, UInt f2, UInt opc2 ) 3220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f2 < 0x20); 3224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (opc2) { 3226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 144: // mtcrf 3227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f2 < 0x100); 3228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown f2 = f2 << 1; 3229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 339: // mfspr 3231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 371: // mftb 3232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 467: // mtspr 3233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f2 < 0x400); 3234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // re-arrange split field 3235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown f2 = ((f2>>5) & 0x1F) | ((f2 & 0x1F)<<5); 3236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: vpanic("mkFormXFX(ppch)"); 3238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((31<<26) | (r1<<21) | (f2<<11) | (opc2<<1)); 3240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Only used by mtfsf 3244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormXFL ( UChar* p, UInt FM, UInt freg, UInt dfp_rm ) 3245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(FM < 0x100); 3248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(freg < 0x20); 3249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((63<<26) | (FM<<17) | (dfp_rm<<16) | (freg<<11) | (711<<1)); 3250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormXS ( UChar* p, UInt opc1, UInt r1, UInt r2, 3254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt imm, UInt opc2, UInt b0 ) 3255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(imm < 0x40); 3261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2); 3263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ((imm & 0x1F)<<11) | (opc2<<2) | ((imm>>5)<<1) | (b0)); 3265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0 3270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'b' 3271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormI ( UChar* p, UInt LI, UInt AA, UInt LK ) 3272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(LI < 0x1000000); 3275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(AA < 0x2); 3276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(LK < 0x2); 3277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((18<<26) | (LI<<2) | (AA<<1) | (LK)); 3278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 3281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 'bc' 3283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormB ( UChar* p, UInt BO, UInt BI, 3284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt BD, UInt AA, UInt LK ) 3285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(BO < 0x20); 3288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(BI < 0x20); 3289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(BD < 0x4000); 3290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(AA < 0x2); 3291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(LK < 0x2); 3292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((16<<26) | (BO<<21) | (BI<<16) | 3293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (BD<<2) | (AA<<1) | (LK)); 3294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// rotates 3298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormM ( UChar* p, UInt opc1, UInt r1, UInt r2, 3299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt f3, UInt MB, UInt ME, UInt Rc ) 3300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(f3 < 0x20); 3306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(MB < 0x20); 3307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(ME < 0x20); 3308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(Rc < 0x2); 3309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (f3<<11) | (MB<<6) | (ME<<1) | (Rc)); 3311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormA ( UChar* p, UInt opc1, UInt r1, UInt r2, 3315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt r4, UInt opc2, UInt b0 ) 3316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r4 < 0x20); 3323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x20); 3324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(b0 < 0x2 ); 3325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (r3<<11) | 3326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r4<<6) | (opc2<<1) | (b0)); 3327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormZ22 ( UChar* p, UInt opc1, UInt r1, UInt r2, 3331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt constant, UInt opc2, UInt b0 ) 3332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 3334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc1 < 0x40); 3335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r1 < 0x20); 3336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r2 < 0x20); 3337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(constant < 0x40); /* 6 bit constant */ 3338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc2 < 0x200); /* 9 bit field */ 3339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(b0 < 0x2); 3340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (constant<<10) | (opc2<<1) | (b0)); 3342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 3343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkFormZ23 ( UChar* p, UInt opc1, UInt r1, UInt r2, 3346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r3, UInt rmc, UInt opc2, UInt b0 ) 3347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 3349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc1 < 0x40); 3350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r1 < 0x20); 3351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r2 < 0x20); 3352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r3 < 0x20); 3353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rmc < 0x4); 3354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc2 < 0x100); 3355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(b0 < 0x2); 3356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (r3<<11) | (rmc<<9) | (opc2<<1) | (b0)); 3358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 3359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* doAMode_IR ( UChar* p, UInt opc1, UInt rSD, 3362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am, Bool mode64 ) 3363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt rA, idx; 3365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(am->tag == Pam_IR); 3366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(am->Pam.IR.index < 0x10000); 3367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rA = iregNo(am->Pam.IR.base, mode64); 3369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown idx = am->Pam.IR.index; 3370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (opc1 == 58 || opc1 == 62) { // ld/std: mode64 only 3372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 3373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* stay sane with DS form: lowest 2 bits must be 00. This 3374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown should be guaranteed to us by iselWordExpr_AMode. */ 3375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (idx & 3)); 3376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, opc1, rSD, rA, idx); 3378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 3379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* doAMode_RR ( UChar* p, UInt opc1, UInt opc2, 3382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt rSD, PPCAMode* am, Bool mode64 ) 3383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt rA, rB; 3385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(am->tag == Pam_RR); 3386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rA = iregNo(am->Pam.RR.base, mode64); 3388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rB = iregNo(am->Pam.RR.index, mode64); 3389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, opc1, rSD, rA, rB, opc2, 0); 3391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 3392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Load imm to r_dst */ 3396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkLoadImm ( UChar* p, UInt r_dst, ULong imm, Bool mode64 ) 3397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r_dst < 0x20); 3399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) { 3401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* In 32-bit mode, make sure the top 32 bits of imm are a sign 3402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown extension of the bottom 32 bits, so that the range tests 3403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown below work correctly. */ 3404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt u32 = (UInt)imm; 3405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int s32 = (Int)u32; 3406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Long s64 = (Long)s32; 3407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm = (ULong)s64; 3408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (imm >= 0xFFFFFFFFFFFF8000ULL || imm < 0x8000) { 3411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // sign-extendable from 16 bits 3412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // addi r_dst,0,imm => li r_dst,imm 3414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 14, r_dst, 0, imm & 0xFFFF); 3415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (imm >= 0xFFFFFFFF80000000ULL || imm < 0x80000000ULL) { 3417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // sign-extendable from 32 bits 3418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16) 3420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF); 3421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // ori r_dst, r_dst, (imm & 0xFFFF) 3422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // full 64bit immediate load: 5 (five!) insns. 3425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 3426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // load high word 3428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // lis r_dst, (imm>>48) & 0xFFFF 3430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF); 3431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // ori r_dst, r_dst, (imm>>32) & 0xFFFF 3433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((imm>>32) & 0xFFFF) 3434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF); 3435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // shift r_dst low word to high word => rldicr 3437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1); 3438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // load low word 3440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // oris r_dst, r_dst, (imm>>16) & 0xFFFF 3442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((imm>>16) & 0xFFFF) 3443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF); 3444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // ori r_dst, r_dst, (imm) & 0xFFFF 3446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (imm & 0xFFFF) 3447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 3451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A simplified version of mkLoadImm that always generates 2 or 5 3454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instructions (32 or 64 bits respectively) even if it could generate 3455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fewer. This is needed for generating fixed sized patchable 3456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sequences. */ 3457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkLoadImm_EXACTLY2or5 ( UChar* p, 3458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst, ULong imm, Bool mode64 ) 3459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 3461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 3463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* In 32-bit mode, make sure the top 32 bits of imm are a sign 3464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng extension of the bottom 32 bits. (Probably unnecessary.) */ 3465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt)imm; 3466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int)u32; 3467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long)s32; 3468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong)s64; 3469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 3472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16) 3473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF); 3474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm & 0xFFFF) 3475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // full 64bit immediate load: 5 (five!) insns. 3479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // load high word 3481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lis r_dst, (imm>>48) & 0xFFFF 3482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF); 3483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm>>32) & 0xFFFF 3485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF); 3486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // shift r_dst low word to high word => rldicr 3488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1); 3489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // load low word 3491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // oris r_dst, r_dst, (imm>>16) & 0xFFFF 3492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF); 3493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm) & 0xFFFF 3495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 3498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Checks whether the sequence of bytes at p was indeed created 3501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng by mkLoadImm_EXACTLY2or5 with the given parameters. */ 3502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool isLoadImm_EXACTLY2or5 ( UChar* p_to_check, 3503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst, ULong imm, Bool mode64 ) 3504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 3506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 3508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* In 32-bit mode, make sure the top 32 bits of imm are a sign 3509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng extension of the bottom 32 bits. (Probably unnecessary.) */ 3510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt)imm; 3511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int)u32; 3512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long)s32; 3513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong)s64; 3514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 3517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt expect[2] = { 0, 0 }; 3518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)&expect[0]; 3519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // addis r_dst,r0,(imm>>16) => lis r_dst, (imm>>16) 3520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 15, r_dst, 0, (imm>>16) & 0xFFFF); 3521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm & 0xFFFF) 3522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(p == (UChar*)&expect[2]); 3524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return fetch32(p_to_check + 0) == expect[0] 3526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 4) == expect[1]; 3527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt expect[5] = { 0, 0, 0, 0, 0 }; 3530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)&expect[0]; 3531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // full 64bit immediate load: 5 (five!) insns. 3532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // load high word 3534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lis r_dst, (imm>>48) & 0xFFFF 3535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 15, r_dst, 0, (imm>>48) & 0xFFFF); 3536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm>>32) & 0xFFFF 3538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, (imm>>32) & 0xFFFF); 3539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // shift r_dst low word to high word => rldicr 3541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormMD(p, 30, r_dst, r_dst, 32, 31, 1); 3542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // load low word 3544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // oris r_dst, r_dst, (imm>>16) & 0xFFFF 3545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 25, r_dst, r_dst, (imm>>16) & 0xFFFF); 3546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm) & 0xFFFF 3548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormD(p, 24, r_dst, r_dst, imm & 0xFFFF); 3549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(p == (UChar*)&expect[5]); 3551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return fetch32(p_to_check + 0) == expect[0] 3553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 4) == expect[1] 3554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 8) == expect[2] 3555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 12) == expect[3] 3556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 16) == expect[4]; 3557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a machine-word sized load or store. Simplified version of 3562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng the Pin_Load and Pin_Store cases below. */ 3563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* do_load_or_store_machine_word ( 3564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p, Bool isLoad, 3565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt reg, PPCAMode* am, Bool mode64 ) 3566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (isLoad) { 3568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1, sz = mode64 ? 8 : 4; 3569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 3570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_IR: 3571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Pam.IR.index & 3)); 3573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: opc1 = 32; vassert(!mode64); break; 3576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: opc1 = 58; vassert(mode64); break; 3577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: vassert(0); 3578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 3580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_RR: 3582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 3583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 3584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else /*store*/ { 3589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1, sz = mode64 ? 8 : 4; 3590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 3591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_IR: 3592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Pam.IR.index & 3)); 3594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: opc1 = 36; vassert(!mode64); break; 3597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: opc1 = 62; vassert(mode64); break; 3598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: vassert(0); 3599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 3601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_RR: 3603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 3604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 3605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 3611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a 32-bit sized load or store. Simplified version of 3614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_load_or_store_machine_word above. */ 3615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* do_load_or_store_word32 ( 3616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p, Bool isLoad, 3617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt reg, PPCAMode* am, Bool mode64 ) 3618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (isLoad) { 3620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1; 3621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 3622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_IR: 3623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Pam.IR.index & 3)); 3625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 32; 3627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 3628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_RR: 3630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 3631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 3632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else /*store*/ { 3637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1; 3638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 3639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_IR: 3640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Pam.IR.index & 3)); 3642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 36; 3644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 3645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pam_RR: 3647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 3648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 3649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 3655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Move r_dst to r_src */ 3658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkMoveReg ( UChar* p, UInt r_dst, UInt r_src ) 3659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r_dst < 0x20); 3661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r_src < 0x20); 3662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (r_dst != r_src) { 3664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* or r_dst, r_src, r_src */ 3665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, r_src, 444, 0 ); 3666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p; 3668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVX ( UChar* p, UInt opc1, UInt r1, UInt r2, 3671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt opc2 ) 3672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x800); 3679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | (r3<<11) | opc2); 3680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVXR ( UChar* p, UInt opc1, UInt r1, UInt r2, 3684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt Rc, UInt opc2 ) 3685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(Rc < 0x2); 3692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x400); 3693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r3<<11) | (Rc<<10) | opc2); 3695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UChar* mkFormVA ( UChar* p, UInt opc1, UInt r1, UInt r2, 3699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r3, UInt r4, UInt opc2 ) 3700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt theInstr; 3702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc1 < 0x40); 3703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r1 < 0x20); 3704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r2 < 0x20); 3705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r3 < 0x20); 3706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(r4 < 0x20); 3707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(opc2 < 0x40); 3708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown theInstr = ((opc1<<26) | (r1<<21) | (r2<<16) | 3709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (r3<<11) | (r4<<6) | opc2); 3710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return emit32(p, theInstr); 3711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 3712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Emit an instruction into buf and return the number of bytes used. 3716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Note that buf is not the insn's final place, and therefore it is 3717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imperative to emit position-independent code. If the emitted 3718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instruction was a profiler inc, set *is_profInc to True, else leave 3719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng it unchanged. 3720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 3721663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt emit_PPCInstr ( /*MB_MOD*/Bool* is_profInc, 3722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* buf, Int nbuf, PPCInstr* i, 3723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bool mode64, 3724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_slowEP, 3725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_fastEP, 3726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xindir, 3727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xassisted ) 3728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 3729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar* p = &buf[0]; 3730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(nbuf >= 32); 3731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (0) { 3733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("asm ");ppPPCInstr(i, mode64); vex_printf("\n"); 3734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->tag) { 3737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LI: 3739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkLoadImm(p, iregNo(i->Pin.LI.dst, mode64), 3740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.LI.imm64, mode64); 3741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Alu: { 3744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR = i->Pin.Alu.srcR; 3745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool immR = toBool(srcR->tag == Prh_Imm); 3746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Alu.dst, mode64); 3747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.Alu.srcL, mode64); 3748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = immR ? (-1)/*bogus*/ : 3749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown iregNo(srcR->Prh.Reg.reg, mode64); 3750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.Alu.op) { 3752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_ADD: 3753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* addi (PPC32 p350) */ 3755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(srcR->Prh.Imm.syned); 3756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(srcR->Prh.Imm.imm16 != 0x8000); 3757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 14, r_dst, r_srcL, srcR->Prh.Imm.imm16); 3758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* add (PPC32 p347) */ 3760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 266, 0); 3761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_SUB: 3765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* addi (PPC32 p350), but with negated imm */ 3767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(srcR->Prh.Imm.syned); 3768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(srcR->Prh.Imm.imm16 != 0x8000); 3769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 14, r_dst, r_srcL, (- srcR->Prh.Imm.imm16)); 3770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* subf (PPC32 p537), with args the "wrong" way round */ 3772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 40, 0); 3773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_AND: 3777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* andi. (PPC32 p358) */ 3779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 28, r_srcL, r_dst, srcR->Prh.Imm.imm16); 3781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* and (PPC32 p356) */ 3783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 28, 0); 3784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_OR: 3788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* ori (PPC32 p497) */ 3790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 24, r_srcL, r_dst, srcR->Prh.Imm.imm16); 3792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* or (PPC32 p495) */ 3794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 444, 0); 3795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Palu_XOR: 3799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* xori (PPC32 p550) */ 3801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 26, r_srcL, r_dst, srcR->Prh.Imm.imm16); 3803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* xor (PPC32 p549) */ 3805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 316, 0); 3806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 3810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 3811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Shft: { 3816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR = i->Pin.Shft.srcR; 3817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32 = i->Pin.Shft.sz32; 3818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool immR = toBool(srcR->tag == Prh_Imm); 3819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Shft.dst, mode64); 3820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.Shft.srcL, mode64); 3821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = immR ? (-1)/*bogus*/ : 3822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown iregNo(srcR->Prh.Reg.reg, mode64); 3823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) 3824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz32); 3825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.Shft.op) { 3827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pshft_SHL: 3828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) { 3829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* rd = rs << n, 1 <= n <= 31 3831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is 3832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rlwinm rd,rs,n,0,31-n (PPC32 p501) 3833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 3834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 32); 3837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormM(p, 21, r_srcL, r_dst, n, 0, 31-n, 0); 3838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* slw (PPC32 p505) */ 3840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 24, 0); 3841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* rd = rs << n, 1 <= n <= 63 3845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is 3846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rldicr rd,rs,n,63-n (PPC64 p559) 3847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 3848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 64); 3851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormMD(p, 30, r_srcL, r_dst, n, 63-n, 1); 3852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* sld (PPC64 p568) */ 3854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 27, 0); 3855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pshft_SHR: 3860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) { 3861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* rd = rs >>u n, 1 <= n <= 31 3863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is 3864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rlwinm rd,rs,32-n,n,31 (PPC32 p501) 3865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 3866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 32); 3869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormM(p, 21, r_srcL, r_dst, 32-n, n, 31, 0); 3870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* srw (PPC32 p508) */ 3872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 536, 0); 3873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* rd = rs >>u n, 1 <= n <= 63 3877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is 3878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rldicl rd,rs,64-n,n (PPC64 p558) 3879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 3880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 64); 3883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormMD(p, 30, r_srcL, r_dst, 64-n, n, 0); 3884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* srd (PPC64 p574) */ 3886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 539, 0); 3887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pshft_SAR: 3892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) { 3893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* srawi (PPC32 p507) */ 3895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* In 64-bit mode, we allow right shifts by zero bits 3898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown as that is a handy way to sign extend the lower 32 3899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bits into the upper 32 bits. */ 3900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mode64) 3901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n >= 0 && n < 32); 3902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else 3903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 32); 3904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, n, 824, 0); 3905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* sraw (PPC32 p506) */ 3907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 792, 0); 3908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (immR) { 3911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* sradi (PPC64 p571) */ 3912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt n = srcR->Prh.Imm.imm16; 3913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!srcR->Prh.Imm.syned); 3914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(n > 0 && n < 64); 3915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXS(p, 31, r_srcL, r_dst, n, 413, 0); 3916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* srad (PPC32 p570) */ 3918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_srcL, r_dst, r_srcR, 794, 0); 3919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 3924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 3925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AddSubC: { 3930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool isAdd = i->Pin.AddSubC.isAdd; 3931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool setC = i->Pin.AddSubC.setC; 3932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.AddSubC.srcL, mode64); 3933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = iregNo(i->Pin.AddSubC.srcR, mode64); 3934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.AddSubC.dst, mode64); 3935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (isAdd) { 3937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (setC) /* addc (PPC32 p348) */ 3938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 10, 0); 3939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else /* adde (PPC32 p349) */ 3940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 138, 0); 3941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 3942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* subfX, with args the "wrong" way round */ 3943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (setC) /* subfc (PPC32 p538) */ 3944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 8, 0); 3945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else /* subfe (PPC32 p539) */ 3946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcR, r_srcL, 0, 136, 0); 3947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Cmp: { 3952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned = i->Pin.Cmp.syned; 3953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32 = i->Pin.Cmp.sz32; 3954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fld1 = i->Pin.Cmp.crfD << 2; 3955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.Cmp.srcL, mode64); 3956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR, imm_srcR; 3957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCRH* srcR = i->Pin.Cmp.srcR; 3958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) // cmp double word invalid for mode32 3960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz32); 3961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else if (!sz32) // mode64 && cmp64: set L=1 3962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fld1 |= 1; 3963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (srcR->tag) { 3965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Imm: 3966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(syned == srcR->Prh.Imm.syned); 3967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm_srcR = srcR->Prh.Imm.imm16; 3968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) { // cmpw/di (signed) (PPC32 p368) 3969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(imm_srcR != 0x8000); 3970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 11, fld1, r_srcL, imm_srcR); 3971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // cmplw/di (unsigned) (PPC32 p370) 3972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 10, fld1, r_srcL, imm_srcR); 3973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Prh_Reg: 3976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_srcR = iregNo(srcR->Prh.Reg.reg, mode64); 3977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // cmpwi (signed) (PPC32 p367) 3978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, fld1, r_srcL, r_srcR, 0, 0); 3979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // cmplwi (unsigned) (PPC32 p379) 3980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, fld1, r_srcL, r_srcR, 32, 0); 3981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 3983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 3984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 3986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 3987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Unary: { 3989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Unary.dst, mode64); 3990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_src = iregNo(i->Pin.Unary.src, mode64); 3991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.Unary.op) { 3993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_NOT: // nor r_dst,r_src,r_src 3994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, r_src, 124, 0); 3995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_NEG: // neg r_dst,r_src 3997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_src, 0, 0, 104, 0); 3998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 3999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_CLZ32: // cntlzw r_dst, r_src 4000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, 0, 26, 0); 4001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_CLZ64: // cntlzd r_dst, r_src 4003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 4004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, 0, 58, 0); 4005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pun_EXTSW: // extsw r_dst, r_src 4007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(mode64); 4008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_src, r_dst, 0, 986, 0); 4009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: goto bad; 4011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MulL: { 4016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned = i->Pin.MulL.syned; 4017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32 = i->Pin.MulL.sz32; 4018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.MulL.dst, mode64); 4019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.MulL.srcL, mode64); 4020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = iregNo(i->Pin.MulL.srcR, mode64); 4021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) 4023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz32); 4024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.MulL.hi) { 4026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // mul hi words, must consider sign 4027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) { 4028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // mulhw r_dst,r_srcL,r_srcR 4029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 75, 0); 4030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // mulhwu r_dst,r_srcL,r_srcR 4031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 11, 0); 4032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 4033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // mulhd r_dst,r_srcL,r_srcR 4034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 73, 0); 4035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // mulhdu r_dst,r_srcL,r_srcR 4036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 9, 0); 4037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 4039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // mul low word, sign is irrelevant 4040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(!i->Pin.MulL.syned); 4041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (sz32) // mullw r_dst,r_srcL,r_srcR 4042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 235, 0); 4043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // mulld r_dst,r_srcL,r_srcR 4044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 233, 0); 4045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Div: { 4050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool syned = i->Pin.Div.syned; 4051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool sz32 = i->Pin.Div.sz32; 4052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Div.dst, mode64); 4053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcL = iregNo(i->Pin.Div.srcL, mode64); 4054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_srcR = iregNo(i->Pin.Div.srcR, mode64); 4055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!mode64) 4057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz32); 4058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.Div.extended) { 4060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sz32) { 4061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (syned) 4062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // divwe r_dst,r_srcL,r_srcR 4063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 427, 0); 4064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 4065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // divweu r_dst,r_srcL,r_srcR 4066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 395, 0); 4067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 4068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (syned) 4069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // divde r_dst,r_srcL,r_srcR 4070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 425, 0); 4071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 4072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // divdeu r_dst,r_srcL,r_srcR 4073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 393, 0); 4074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 4075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else if (sz32) { 4076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // divw r_dst,r_srcL,r_srcR 4077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 491, 0); 4078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // divwu r_dst,r_srcL,r_srcR 4079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 459, 0); 4080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 4081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (syned) // divd r_dst,r_srcL,r_srcR 4082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 489, 0); 4083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else // divdu r_dst,r_srcL,r_srcR 4084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXO(p, 31, r_dst, r_srcL, r_srcR, 0, 457, 0); 4085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Call: { 4090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->Pin.Call.cond.test != Pct_ALWAYS 4091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && i->Pin.Call.rloc.pri != RLPri_None) { 4092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* The call might not happen (it isn't unconditional) and it 4093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov returns a result. In this case we will need to generate a 4094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov control flow diamond to put 0x555..555 in the return 4095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov register(s) in the case where the call doesn't happen. If 4096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov this ever becomes necessary, maybe copy code from the ARM 4097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov equivalent. Until that day, just give up. */ 4098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond = i->Pin.Call.cond; 4101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = 10; 4102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* As per detailed comment for Pin_Call in 4103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown getRegUsage_PPCInstr above, %r10 is used as an address temp */ 4104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* jump over the following insns if condition does not hold */ 4106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 4107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test != Pct_ALWAYS) { 4108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* jmp fwds if !condition */ 4109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* don't know how many bytes to jump over yet... 4110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown make space for a jump instruction and fill in later. */ 4111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ptmp = p; /* fill in this bit later */ 4112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p += 4; // p += 4 4113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* load target to r_dst */ // p += 4|8|20 4116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkLoadImm(p, r_dst, i->Pin.Call.target, mode64); 4117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* mtspr 9,r_dst => move r_dst to count register */ 4119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXFX(p, r_dst, 9, 467); // p += 4 4120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bctrl => branch to count register (and save to lr) */ 4122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 1); // p += 4 4123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Fix up the conditional jump, if there was one. */ 4125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test != Pct_ALWAYS) { 4126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int delta = p - ptmp; 4127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(delta >= 16 && delta <= 32); 4128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,delta */ 4129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mkFormB(ptmp, invertCondTest(cond.test), 4130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cond.flag, (delta>>2), 0, 0); 4131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XDirect: { 4136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* NB: what goes on here has to be very closely coordinated 4137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng with the chainXDirect_PPC and unchainXDirect_PPC below. */ 4138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We're generating chain-me requests here, so we need to be 4139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sure this is actually allowed -- no-redir translations 4140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng can't use chain-me's. Hence: */ 4141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_chain_me_to_slowEP != NULL); 4142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_chain_me_to_fastEP != NULL); 4143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional jump 4145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng over the rest of it. Or at least, leave a space for it that 4146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we will shortly fill in. */ 4147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 4148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XDirect.cond.test != Pct_ALWAYS) { 4149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XDirect.cond.flag != Pcf_NONE); 4150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 4151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p += 4; 4152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 4153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XDirect.cond.flag == Pcf_NONE); 4154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest CIA. */ 4157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r30, dstGA */ 4158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) vassert(0 == (((ULong)i->Pin.XDirect.dstGA) >> 32)); 4159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, /*r*/30, (ULong)i->Pin.XDirect.dstGA, mode64); 4160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* stw/std r30, amCIA */ 4161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word( 4162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, False/*!isLoad*/, 4163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /*r*/30, i->Pin.XDirect.amCIA, mode64 4164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ); 4165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* --- FIRST PATCHABLE BYTE follows --- */ 4167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* VG_(disp_cp_chain_me_to_{slowEP,fastEP}) (where we're calling 4168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng to) backs up the return address, so as to find the address of 4169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng the first patchable byte. So: don't change the number of 4170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instructions (32-bit: 4, 64-bit: 7) below. */ 4171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64-fixed r30, VG_(disp_cp_chain_me_to_{slowEP,fastEP} */ 4172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me 4173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng = i->Pin.XDirect.toFastEP ? disp_cp_chain_me_to_fastEP 4174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : disp_cp_chain_me_to_slowEP; 4175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5( 4176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, /*r*/30, Ptr_to_ULong(disp_cp_chain_me), mode64); 4177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtctr r30 */ 4178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFX(p, /*r*/30, 9, 467); 4179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bctrl */ 4180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 1); 4181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* --- END of PATCHABLE BYTES --- */ 4182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 4184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XDirect.cond.test != Pct_ALWAYS) { 4185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 4186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta >= 16 && delta <= 64 && 0 == (delta & 3)); 4187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bc !ct,cf,delta */ 4188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mkFormB(ptmp, invertCondTest(i->Pin.XDirect.cond.test), 4189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XDirect.cond.flag, (delta>>2), 0, 0); 4190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 4192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XIndir: { 4195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We're generating transfers that could lead indirectly to a 4196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng chain-me, so we need to be sure this is actually allowed -- 4197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng no-redir translations are not allowed to reach normal 4198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng translations without going through the scheduler. That means 4199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng no XDirects or XIndirs out from no-redir translations. 4200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Hence: */ 4201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_xindir != NULL); 4202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional jump 4204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng over the rest of it. Or at least, leave a space for it that 4205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we will shortly fill in. */ 4206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 4207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XIndir.cond.test != Pct_ALWAYS) { 4208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XIndir.cond.flag != Pcf_NONE); 4209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 4210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 4; 4211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 4212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XIndir.cond.flag == Pcf_NONE); 4213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest CIA. */ 4216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* stw/std r-dstGA, amCIA */ 4217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word( 4218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, False/*!isLoad*/, 4219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng iregNo(i->Pin.XIndir.dstGA, mode64), 4220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.amCIA, mode64 4221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ); 4222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r30, VG_(disp_cp_xindir) */ 4224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, /*r*/30, (ULong)Ptr_to_ULong(disp_cp_xindir), mode64); 4225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtctr r30 */ 4226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFX(p, /*r*/30, 9, 467); 4227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bctr */ 4228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0); 4229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 4231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XIndir.cond.test != Pct_ALWAYS) { 4232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 4233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta >= 16 && delta <= 32 && 0 == (delta & 3)); 4234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bc !ct,cf,delta */ 4235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mkFormB(ptmp, invertCondTest(i->Pin.XIndir.cond.test), 4236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.cond.flag, (delta>>2), 0, 0); 4237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 4239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_XAssisted: { 4242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional jump 4243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng over the rest of it. Or at least, leave a space for it that 4244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we will shortly fill in. */ 4245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 4246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XAssisted.cond.test != Pct_ALWAYS) { 4247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XAssisted.cond.flag != Pcf_NONE); 4248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 4249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 4; 4250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 4251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Pin.XAssisted.cond.flag == Pcf_NONE); 4252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest CIA. */ 4255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* stw/std r-dstGA, amCIA */ 4256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word( 4257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, False/*!isLoad*/, 4258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng iregNo(i->Pin.XIndir.dstGA, mode64), 4259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XIndir.amCIA, mode64 4260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ); 4261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r31, $magic_number */ 4263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt trcval = 0; 4264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.XAssisted.jk) { 4265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_ClientReq: trcval = VEX_TRC_JMP_CLIENTREQ; break; 4266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break; 4267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Sys_int128: trcval = VEX_TRC_JMP_SYS_INT128; break; 4268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Yield: trcval = VEX_TRC_JMP_YIELD; break; 4269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_EmWarn: trcval = VEX_TRC_JMP_EMWARN; break; 4270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_EmFail: trcval = VEX_TRC_JMP_EMFAIL; break; 4271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_MapFail: trcval = VEX_TRC_JMP_MAPFAIL; break; 4272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_NoDecode: trcval = VEX_TRC_JMP_NODECODE; break; 4273eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case Ijk_InvalICache: trcval = VEX_TRC_JMP_INVALICACHE; break; 4274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_NoRedir: trcval = VEX_TRC_JMP_NOREDIR; break; 4275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_SigTRAP: trcval = VEX_TRC_JMP_SIGTRAP; break; 4276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_SigSEGV: trcval = VEX_TRC_JMP_SIGSEGV; break; 4277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_SigBUS: trcval = VEX_TRC_JMP_SIGBUS; break; 4278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_Boring: trcval = VEX_TRC_JMP_BORING; break; 4279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We don't expect to see the following being assisted. */ 4280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Ret: 4281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Call: 4282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fallthrough */ 4283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 4284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppIRJumpKind(i->Pin.XAssisted.jk); 4285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("emit_ARMInstr.Pin_XAssisted: unexpected jump kind"); 4286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(trcval != 0); 4288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, /*r*/31, trcval, mode64); 4289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r30, VG_(disp_cp_xassisted) */ 4291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, /*r*/30, 4292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (ULong)Ptr_to_ULong(disp_cp_xassisted), mode64); 4293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtctr r30 */ 4294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFX(p, /*r*/30, 9, 467); 4295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bctr */ 4296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0); 4297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Fix up the conditional jump, if there was one. */ 4299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Pin.XAssisted.cond.test != Pct_ALWAYS) { 4300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int delta = p - ptmp; 4301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta >= 16 && delta <= 32 && 0 == (delta & 3)); 4302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,delta */ 4303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mkFormB(ptmp, invertCondTest(i->Pin.XAssisted.cond.test), 4304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.XAssisted.cond.flag, (delta>>2), 0, 0); 4305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_CMov: { 4310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst, r_src; 4311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong imm_src; 4312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond; 4313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(i->Pin.CMov.cond.test != Pct_ALWAYS); 4314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_dst = iregNo(i->Pin.CMov.dst, mode64); 4316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cond = i->Pin.CMov.cond; 4317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* branch (if cond fails) over move instrs */ 4319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* ptmp = NULL; 4320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test != Pct_ALWAYS) { 4321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* don't know how many bytes to jump over yet... 4322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown make space for a jump instruction and fill in later. */ 4323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ptmp = p; /* fill in this bit later */ 4324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p += 4; 4325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // cond true: move src => dst 4328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.CMov.src->tag) { 4329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Imm: 4330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown imm_src = i->Pin.CMov.src->Pri.Imm; 4331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkLoadImm(p, r_dst, imm_src, mode64); // p += 4|8|20 4332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pri_Reg: 4334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_src = iregNo(i->Pin.CMov.src->Pri.Reg, mode64); 4335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkMoveReg(p, r_dst, r_src); // p += 4 4336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: goto bad; 4338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Fix up the conditional jump, if there was one. */ 4341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test != Pct_ALWAYS) { 4342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int delta = p - ptmp; 4343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(delta >= 8 && delta <= 24); 4344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,delta */ 4345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mkFormB(ptmp, invertCondTest(cond.test), 4346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cond.flag, (delta>>2), 0, 0); 4347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Load: { 4352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am_addr = i->Pin.Load.src; 4353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Load.dst, mode64); 4354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc1, opc2, sz = i->Pin.Load.sz; 4355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (am_addr->tag) { 4356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_IR: 4357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mode64 && (sz == 4 || sz == 8)) { 4358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* should be guaranteed to us by iselWordExpr_AMode */ 4359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (am_addr->Pam.IR.index & 3)); 4360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch(sz) { 4362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 1: opc1 = 34; break; 4363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 2: opc1 = 40; break; 4364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 4: opc1 = 32; break; 4365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 8: opc1 = 58; vassert(mode64); break; 4366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: goto bad; 4367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_IR(p, opc1, r_dst, am_addr, mode64); 4369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_RR: 4371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch(sz) { 4372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 1: opc2 = 87; break; 4373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 2: opc2 = 279; break; 4374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 4: opc2 = 23; break; 4375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 8: opc2 = 21; vassert(mode64); break; 4376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: goto bad; 4377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_RR(p, 31, opc2, r_dst, am_addr, mode64); 4379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_LoadL: { 4386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.LoadL.sz == 4) { 4387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.LoadL.dst, mode64), 4388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0, iregNo(i->Pin.LoadL.src, mode64), 20, 0); 4389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.LoadL.sz == 8 && mode64) { 4392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.LoadL.dst, mode64), 4393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0, iregNo(i->Pin.LoadL.src, mode64), 84, 0); 4394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Set: { 4400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Make the destination register be 1 or 0, depending on whether 4401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the relevant condition holds. */ 4402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.Set.dst, mode64); 4403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cond = i->Pin.Set.cond; 4404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt rot_imm, r_tmp; 4405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test == Pct_ALWAYS) { 4407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Just load 1 to dst => li dst,1 4408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 14, r_dst, 0, 1); 4409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 4410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vassert(cond.flag != Pcf_NONE); 4411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rot_imm = 1 + cond.flag; 4412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_tmp = 0; // Not set in getAllocable, so no need to declare. 4413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // r_tmp = CR => mfcr r_tmp 4415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_tmp, 0, 0, 19, 0); 4416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // r_dst = flag (rotate left and mask) 4418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // => rlwinm r_dst,r_tmp,rot_imm,31,31 4419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormM(p, 21, r_tmp, r_dst, rot_imm, 31, 31, 0); 4420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cond.test == Pct_FALSE) { 4422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // flip bit => xori r_dst,r_dst,1 4423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormD(p, 26, r_dst, r_dst, 1); 4424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MfCR: 4430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // mfcr dst 4431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.MfCR.dst, mode64), 0, 0, 19, 0); 4432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_MFence: { 4435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, 0, 0, 0, 598, 0); // sync, PPC32 p616 4436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // CAB: Should this be isync? 4437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // p = mkFormXL(p, 19, 0, 0, 0, 150, 0); // isync, PPC32 p467 4438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_Store: { 4442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am_addr = i->Pin.Store.dst; 4443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_src = iregNo(i->Pin.Store.src, mode64); 4444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc1, opc2, sz = i->Pin.Store.sz; 4445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.Store.dst->tag) { 4446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_IR: 4447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mode64 && (sz == 4 || sz == 8)) { 4448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* should be guaranteed to us by iselWordExpr_AMode */ 4449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(0 == (am_addr->Pam.IR.index & 3)); 4450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch(sz) { 4452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 1: opc1 = 38; break; 4453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 2: opc1 = 44; break; 4454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 4: opc1 = 36; break; 4455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 8: vassert(mode64); 4456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc1 = 62; break; 4457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_IR(p, opc1, r_src, am_addr, mode64); 4461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pam_RR: 4463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch(sz) { 4464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 1: opc2 = 215; break; 4465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 2: opc2 = 407; break; 4466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 4: opc2 = 151; break; 4467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case 8: vassert(mode64); 4468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = 149; break; 4469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_RR(p, 31, opc2, r_src, am_addr, mode64); 4473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_StoreC: { 4481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.StoreC.sz == 4) { 4482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.StoreC.src, mode64), 4483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0, iregNo(i->Pin.StoreC.dst, mode64), 150, 1); 4484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.StoreC.sz == 8 && mode64) { 4487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, iregNo(i->Pin.StoreC.src, mode64), 4488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0, iregNo(i->Pin.StoreC.dst, mode64), 214, 1); 4489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpUnary: { 4495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpUnary.dst); 4496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpUnary.src); 4497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.FpUnary.op) { 4498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_RSQRTE: // frsqrtre, PPC32 p424 4499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, 0, fr_src, 0, 26, 0 ); 4500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_RES: // fres, PPC32 p421 4502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, 0, fr_src, 0, 24, 0 ); 4503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_SQRT: // fsqrt, PPC32 p427 4505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, 0, fr_src, 0, 22, 0 ); 4506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_ABS: // fabs, PPC32 p399 4508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 264, 0); 4509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_NEG: // fneg, PPC32 p416 4511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 40, 0); 4512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MOV: // fmr, PPC32 p410 4514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 72, 0); 4515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIM: // frim, PPC ISA 2.05 p137 4517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 488, 0); 4518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIP: // frip, PPC ISA 2.05 p137 4520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 456, 0); 4521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIN: // frin, PPC ISA 2.05 p137 4523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 392, 0); 4524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_FRIZ: // friz, PPC ISA 2.05 p137 4526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 424, 0); 4527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpBinary: { 4535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpBinary.dst); 4536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcL = fregNo(i->Pin.FpBinary.srcL); 4537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcR = fregNo(i->Pin.FpBinary.srcR); 4538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.FpBinary.op) { 4539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_ADDD: // fadd, PPC32 p400 4540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 21, 0 ); 4541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_ADDS: // fadds, PPC32 p401 4543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 21, 0 ); 4544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_SUBD: // fsub, PPC32 p429 4546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 20, 0 ); 4547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_SUBS: // fsubs, PPC32 p430 4549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 20, 0 ); 4550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MULD: // fmul, PPC32 p413 4552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcL, 0, fr_srcR, 25, 0 ); 4553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MULS: // fmuls, PPC32 p414 4555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcL, 0, fr_srcR, 25, 0 ); 4556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_DIVD: // fdiv, PPC32 p406 4558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcL, fr_srcR, 0, 18, 0 ); 4559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_DIVS: // fdivs, PPC32 p407 4561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcL, fr_srcR, 0, 18, 0 ); 4562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpMulAcc: { 4570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpMulAcc.dst); 4571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcML = fregNo(i->Pin.FpMulAcc.srcML); 4572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcMR = fregNo(i->Pin.FpMulAcc.srcMR); 4573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcAcc = fregNo(i->Pin.FpMulAcc.srcAcc); 4574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.FpMulAcc.op) { 4575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MADDD: // fmadd, PPC32 p408 4576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 29, 0 ); 4577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MADDS: // fmadds, PPC32 p409 4579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 29, 0 ); 4580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MSUBD: // fmsub, PPC32 p411 4582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 63, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 28, 0 ); 4583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pfp_MSUBS: // fmsubs, PPC32 p412 4585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormA( p, 59, fr_dst, fr_srcML, fr_srcAcc, fr_srcMR, 28, 0 ); 4586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdSt: { 4594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCAMode* am_addr = i->Pin.FpLdSt.addr; 4595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt f_reg = fregNo(i->Pin.FpLdSt.reg); 4596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.FpLdSt.addr->tag == Pam_RR); 4597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.FpLdSt.sz; 4598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc; 4599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 4 || sz == 8); 4600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpLdSt.isLoad) { // Load from memory 4602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (idxd) { // lf[s|d]x, PPC32 p444|440 4603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc = (sz == 4) ? 535 : 599; 4604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_RR(p, 31, opc, f_reg, am_addr, mode64); 4605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // lf[s|d], PPC32 p441|437 4606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc = (sz == 4) ? 48 : 50; 4607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_IR(p, opc, f_reg, am_addr, mode64); 4608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // Store to memory 4610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (idxd) { // stf[s|d]x, PPC32 p521|516 4611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc = (sz == 4) ? 663 : 727; 4612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_RR(p, 31, opc, f_reg, am_addr, mode64); 4613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // stf[s|d], PPC32 p518|513 4614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc = (sz == 4) ? 52 : 54; 4615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = doAMode_IR(p, opc, f_reg, am_addr, mode64); 4616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpSTFIW: { 4622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt ir_addr = iregNo(i->Pin.FpSTFIW.addr, mode64); 4623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_data = fregNo(i->Pin.FpSTFIW.data); 4624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // stfiwx (store fp64[lo32] as int32), PPC32 p517 4625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Use rA==0, so that EA == rB == ir_addr 4626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, fr_data, 0/*rA=0*/, ir_addr, 983, 0); 4627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpRSP: { 4631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpRSP.dst); 4632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpRSP.src); 4633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // frsp, PPC32 p423 4634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 12, 0); 4635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCftI: { 4639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpCftI.dst); 4640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpCftI.src); 4641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == True) { 4642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) { 4643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fctiw (conv f64 to i32), PPC32 p404 4644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 14, 0); 4645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 4647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fctiwu (conv f64 to u32) 4648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 142, 0); 4649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 4651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCftI.fromI == False && i->Pin.FpCftI.int32 == False) { 4653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) { 4654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fctid (conv f64 to i64), PPC64 p437 4655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 814, 0); 4656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 4658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fctidu (conv f64 to u64) 4659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 942, 0); 4660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 4662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) { 4664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (i->Pin.FpCftI.syned == True) { 4665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fcfid (conv i64 to f64), PPC64 p434 4666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 846, 0); 4667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else if (i->Pin.FpCftI.flt64 == True) { 4669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fcfidu (conv u64 to f64) 4670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 63, fr_dst, 0, fr_src, 974, 0); 4671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 4673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // fcfidus (conv u64 to f32) 4674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p = mkFormX(p, 59, fr_dst, 0, fr_src, 974, 0); 4675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov goto done; 4676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 4677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCMov: { 4682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_dst = fregNo(i->Pin.FpCMov.dst); 4683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpCMov.src); 4684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cc = i->Pin.FpCMov.cond; 4685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (fr_dst == fr_src) goto done; 4687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cc.test != Pct_ALWAYS); 4689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* jmp fwds if !condition */ 4691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cc.test != Pct_ALWAYS) { 4692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,n_bytes>>2 */ 4693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormB(p, invertCondTest(cc.test), cc.flag, 8>>2, 0, 0); 4694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // fmr, PPC32 p410 4697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, fr_dst, 0, fr_src, 72, 0); 4698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpLdFPSCR: { 4702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_src = fregNo(i->Pin.FpLdFPSCR.src); 4703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFL(p, 0xFF, fr_src, i->Pin.FpLdFPSCR.dfp_rm); // mtfsf, PPC32 p480 4704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_FpCmp: { 4708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar crfD = 1; 4709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt r_dst = iregNo(i->Pin.FpCmp.dst, mode64); 4710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcL = fregNo(i->Pin.FpCmp.srcL); 4711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt fr_srcR = fregNo(i->Pin.FpCmp.srcR); 4712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(crfD < 8); 4713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // fcmpo, PPC32 p402 4714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 63, crfD<<2, fr_srcL, fr_srcR, 32, 0); 4715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // mfcr (mv CR to r_dst), PPC32 p467 4717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, r_dst, 0, 0, 19, 0); 4718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // rlwinm r_dst,r_dst,8,28,31, PPC32 p501 4720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // => rotate field 1 to bottomw of word, masking out upper 28 4721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0); 4722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_RdWrLR: { 4726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt reg = iregNo(i->Pin.RdWrLR.gpr, mode64); 4727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* wrLR==True ? mtlr r4 : mflr r4 */ 4728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormXFX(p, reg, 8, (i->Pin.RdWrLR.wrLR==True) ? 467 : 339); 4729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* AltiVec */ 4734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdSt: { 4735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2, v_reg, r_idx, r_base; 4736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.AvLdSt.sz; 4737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool idxd = toBool(i->Pin.AvLdSt.addr->tag == Pam_RR); 4738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 1 || sz == 2 || sz == 4 || sz == 16); 4739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown v_reg = vregNo(i->Pin.AvLdSt.reg); 4741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_base = iregNo(i->Pin.AvLdSt.addr->Pam.RR.base, mode64); 4742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Only have AltiVec AMode_RR: kludge AMode_IR 4744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!idxd) { 4745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_idx = 30; // XXX: Using r30 as temp 4746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkLoadImm(p, r_idx, 4747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown i->Pin.AvLdSt.addr->Pam.IR.index, mode64); 4748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 4749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r_idx = iregNo(i->Pin.AvLdSt.addr->Pam.RR.index, mode64); 4750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.FpLdSt.isLoad) { // Load from memory (1,2,4,16) 4753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = (sz==1) ? 7 : (sz==2) ? 39 : (sz==4) ? 71 : 103; 4754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, v_reg, r_idx, r_base, opc2, 0); 4755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { // Store to memory (1,2,4,16) 4756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = (sz==1) ? 135 : (sz==2) ? 167 : (sz==4) ? 199 : 231; 4757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormX(p, 31, v_reg, r_idx, r_base, opc2, 0); 4758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUnary: { 4763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvUnary.dst); 4764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src = vregNo(i->Pin.AvUnary.src); 4765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvUnary.op) { 4767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MOV: opc2 = 1156; break; // vor vD,vS,vS 4768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_NOT: opc2 = 1284; break; // vnor vD,vS,vS 4769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKH8S: opc2 = 526; break; // vupkhsb 4770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKH16S: opc2 = 590; break; // vupkhsh 4771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKL8S: opc2 = 654; break; // vupklsb 4772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKL16S: opc2 = 718; break; // vupklsh 4773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKHPIX: opc2 = 846; break; // vupkhpx 4774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_UNPCKLPIX: opc2 = 974; break; // vupklpx 4775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ZEROCNTBYTE: opc2 = 1794; break; // vclzb 4777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ZEROCNTHALF: opc2 = 1858; break; // vclzh 4778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ZEROCNTWORD: opc2 = 1922; break; // vclzw 4779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ZEROCNTDBL: opc2 = 1986; break; // vclzd 4780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_BITMTXXPOSE: opc2 = 1292; break; // vgbbd 4781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvUnary.op) { 4785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MOV: 4786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_NOT: 4787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_src, v_src, opc2 ); 4788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, 0, v_src, opc2 ); 4791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 4792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBinary: { 4797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBinary.dst); 4798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBinary.srcL); 4799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBinary.srcR); 4800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvBinary.op == Pav_SHL) { 4802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1036 ); // vslo 4803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_dst, v_srcR, 452 ); // vsl 4804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvBinary.op == Pav_SHR) { 4807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1100 ); // vsro 4808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_dst, v_srcR, 708 ); // vsr 4809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBinary.op) { 4812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Bitwise */ 4813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AND: opc2 = 1028; break; // vand 4814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OR: opc2 = 1156; break; // vor 4815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_XOR: opc2 = 1220; break; // vxor 4816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 4820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin8x16: { 4824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBin8x16.dst); 4825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBin8x16.srcL); 4826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBin8x16.srcR); 4827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBin8x16.op) { 4829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ADDU: opc2 = 0; break; // vaddubm 4831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDU: opc2 = 512; break; // vaddubs 4832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDS: opc2 = 768; break; // vaddsbs 4833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SUBU: opc2 = 1024; break; // vsububm 4835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBU: opc2 = 1536; break; // vsububs 4836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBS: opc2 = 1792; break; // vsubsbs 4837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULU: opc2 = 8; break; // vmuloub 4839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULS: opc2 = 264; break; // vmulosb 4840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULU: opc2 = 520; break; // vmuleub 4841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULS: opc2 = 776; break; // vmulesb 4842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGU: opc2 = 1026; break; // vavgub 4844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGS: opc2 = 1282; break; // vavgsb 4845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXU: opc2 = 2; break; // vmaxub 4846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXS: opc2 = 258; break; // vmaxsb 4847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINU: opc2 = 514; break; // vminub 4848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINS: opc2 = 770; break; // vminsb 4849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPEQU: opc2 = 6; break; // vcmpequb 4851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTU: opc2 = 518; break; // vcmpgtub 4852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTS: opc2 = 774; break; // vcmpgtsb 4853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHL: opc2 = 260; break; // vslb 4855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHR: opc2 = 516; break; // vsrb 4856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SAR: opc2 = 772; break; // vsrab 4857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ROTL: opc2 = 4; break; // vrlb 4858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGHI: opc2 = 12; break; // vmrghb 4860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGLO: opc2 = 268; break; // vmrglb 4861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_POLYMULADD: opc2 = 1032; break; // vpmsumb 4863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 4868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin16x8: { 4872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBin16x8.dst); 4873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBin16x8.srcL); 4874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBin16x8.srcR); 4875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBin16x8.op) { 4877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ADDU: opc2 = 64; break; // vadduhm 4879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDU: opc2 = 576; break; // vadduhs 4880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDS: opc2 = 832; break; // vaddshs 4881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SUBU: opc2 = 1088; break; // vsubuhm 4883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBU: opc2 = 1600; break; // vsubuhs 4884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBS: opc2 = 1856; break; // vsubshs 4885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULU: opc2 = 72; break; // vmulouh 4887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_OMULS: opc2 = 328; break; // vmulosh 4888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULU: opc2 = 584; break; // vmuleuh 4889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_EMULS: opc2 = 840; break; // vmulesh 4890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGU: opc2 = 1090; break; // vavguh 4892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGS: opc2 = 1346; break; // vavgsh 4893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXU: opc2 = 66; break; // vmaxuh 4894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXS: opc2 = 322; break; // vmaxsh 4895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINS: opc2 = 834; break; // vminsh 4896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINU: opc2 = 578; break; // vminuh 4897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPEQU: opc2 = 70; break; // vcmpequh 4899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTU: opc2 = 582; break; // vcmpgtuh 4900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTS: opc2 = 838; break; // vcmpgtsh 4901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHL: opc2 = 324; break; // vslh 4903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHR: opc2 = 580; break; // vsrh 4904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SAR: opc2 = 836; break; // vsrah 4905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ROTL: opc2 = 68; break; // vrlh 4906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_PACKUU: opc2 = 14; break; // vpkuhum 4908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKUU: opc2 = 142; break; // vpkuhus 4909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSU: opc2 = 270; break; // vpkshus 4910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSS: opc2 = 398; break; // vpkshss 4911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_PACKPXL: opc2 = 782; break; // vpkpx 4912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGHI: opc2 = 76; break; // vmrghh 4914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGLO: opc2 = 332; break; // vmrglh 4915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_POLYMULADD: opc2 = 1224; break; // vpmsumh 4917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 4922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32x4: { 4926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBin32x4.dst); 4927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBin32x4.srcL); 4928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBin32x4.srcR); 4929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 4930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBin32x4.op) { 4931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ADDU: opc2 = 128; break; // vadduwm 4933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDU: opc2 = 640; break; // vadduws 4934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QADDS: opc2 = 896; break; // vaddsws 4935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SUBU: opc2 = 1152; break; // vsubuwm 4937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBU: opc2 = 1664; break; // vsubuws 4938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QSUBS: opc2 = 1920; break; // vsubsws 4939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_MULU: opc2 = 137; break; // vmuluwm 4941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_OMULU: opc2 = 136; break; // vmulouw 4942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_OMULS: opc2 = 392; break; // vmulosw 4943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_EMULU: opc2 = 648; break; // vmuleuw 4944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_EMULS: opc2 = 904; break; // vmulesw 4945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGU: opc2 = 1154; break; // vavguw 4947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_AVGS: opc2 = 1410; break; // vavgsw 4948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXU: opc2 = 130; break; // vmaxuw 4950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MAXS: opc2 = 386; break; // vmaxsw 4951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINS: opc2 = 898; break; // vminsw 4953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MINU: opc2 = 642; break; // vminuw 4954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPEQU: opc2 = 134; break; // vcmpequw 4956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTS: opc2 = 902; break; // vcmpgtsw 4957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_CMPGTU: opc2 = 646; break; // vcmpgtuw 4958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHL: opc2 = 388; break; // vslw 4960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SHR: opc2 = 644; break; // vsrw 4961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_SAR: opc2 = 900; break; // vsraw 4962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_ROTL: opc2 = 132; break; // vrlw 4963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_PACKUU: opc2 = 78; break; // vpkuwum 4965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKUU: opc2 = 206; break; // vpkuwus 4966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSU: opc2 = 334; break; // vpkswus 4967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_QPACKSS: opc2 = 462; break; // vpkswss 4968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGHI: opc2 = 140; break; // vmrghw 4970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pav_MRGLO: opc2 = 396; break; // vmrglw 4971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CATODD: opc2 = 1676; break; // vmrgow 4973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CATEVEN: opc2 = 1932; break; // vmrgew 4974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_POLYMULADD: opc2 = 1160; break; // vpmsumw 4976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 4978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 4979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 4981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 4982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 4983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvBin64x2: { 4985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_dst = vregNo(i->Pin.AvBin64x2.dst); 4986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_srcL = vregNo(i->Pin.AvBin64x2.srcL); 4987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_srcR = vregNo(i->Pin.AvBin64x2.srcR); 4988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt opc2; 4989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->Pin.AvBin64x2.op) { 4990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ADDU: opc2 = 192; break; // vaddudm vector double add 4991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SUBU: opc2 = 1216; break; // vsubudm vector double add 4992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_MAXU: opc2 = 194; break; // vmaxud vector double max 4993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_MAXS: opc2 = 450; break; // vmaxsd vector double max 4994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_MINU: opc2 = 706; break; // vminud vector double min 4995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_MINS: opc2 = 962; break; // vminsd vector double min 4996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CMPEQU: opc2 = 199; break; // vcmpequd vector double compare 4997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CMPGTU: opc2 = 711; break; // vcmpgtud vector double compare 4998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CMPGTS: opc2 = 967; break; // vcmpgtsd vector double compare 4999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SHL: opc2 = 1476; break; // vsld 5000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SHR: opc2 = 1732; break; // vsrd 5001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SAR: opc2 = 964; break; // vsrad 5002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_ROTL: opc2 = 196; break; // vrld 5003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_PACKUU: opc2 = 1102; break; // vpkudum 5004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_QPACKUU: opc2 = 1230; break; // vpkudus, vpksdus (emulated) 5005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_QPACKSS: opc2 = 1486; break; // vpksdsm 5006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_MRGHI: opc2 = 1614; break; // vmrghw 5007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_MRGLO: opc2 = 1742; break; // vmrglw 5008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_POLYMULADD: opc2 = 1096; break; // vpmsumd 5009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 5010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 5011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 5013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvCipherV128Unary: { 5016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_dst = vregNo(i->Pin.AvCipherV128Unary.dst); 5017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_src = vregNo(i->Pin.AvCipherV128Unary.src); 5018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt opc2; 5019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->Pin.AvCipherV128Unary.op) { 5020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CIPHERSUBV128: opc2 = 1480; break; // vsbox 5021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 5022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 5023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormVX( p, 4, v_dst, v_src, 0, opc2 ); 5025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvCipherV128Binary: { 5028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_dst = vregNo(i->Pin.AvCipherV128Binary.dst); 5029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_srcL = vregNo(i->Pin.AvCipherV128Binary.srcL); 5030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_srcR = vregNo(i->Pin.AvCipherV128Binary.srcR); 5031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt opc2; 5032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->Pin.AvCipherV128Binary.op) { 5033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CIPHERV128: opc2 = 1288; break; // vcipher 5034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_CIPHERLV128: opc2 = 1289; break; // vcipherlast 5035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_NCIPHERV128: opc2 = 1352; break; // vncipher 5036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_NCIPHERLV128: opc2 = 1353; break; // vncipherlast 5037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 5038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 5039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, opc2 ); 5041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvHashV128Binary: { 5044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_dst = vregNo(i->Pin.AvHashV128Binary.dst); 5045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_src = vregNo(i->Pin.AvHashV128Binary.src); 5046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCRI* s_field = i->Pin.AvHashV128Binary.s_field; 5047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt opc2; 5048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->Pin.AvHashV128Binary.op) { 5049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SHA256: opc2 = 1666; break; // vshasigmaw 5050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_SHA512: opc2 = 1730; break; // vshasigmad 5051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 5052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 5053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormVX( p, 4, v_dst, v_src, s_field->Pri.Imm, opc2 ); 5055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pin_AvBCDV128Trinary: { 5058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_dst = vregNo(i->Pin.AvBCDV128Trinary.dst); 5059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_src1 = vregNo(i->Pin.AvBCDV128Trinary.src1); 5060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt v_src2 = vregNo(i->Pin.AvBCDV128Trinary.src2); 5061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov PPCRI* ps = i->Pin.AvBCDV128Trinary.ps; 5062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt opc2; 5063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->Pin.AvBCDV128Trinary.op) { 5064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_BCDAdd: opc2 = 1; break; // bcdadd 5065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Pav_BCDSub: opc2 = 65; break; // bcdsub 5066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 5067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 5068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormVXR( p, 4, v_dst, v_src1, v_src2, 5070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0x1, (ps->Pri.Imm << 9) | opc2 ); 5071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 5072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 5073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvBin32Fx4: { 5074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvBin32Fx4.dst); 5075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvBin32Fx4.srcL); 5076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvBin32Fx4.srcR); 5077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvBin32Fx4.op) { 5078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ADDF: 5080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 10 ); // vaddfp 5081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 5082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_SUBF: 5083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 74 ); // vsubfp 5084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 5085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MAXF: 5086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1034 ); // vmaxfp 5087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 5088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MINF: 5089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_srcL, v_srcR, 1098 ); // vminfp 5090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 5091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_MULF: { 5093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Make a vmulfp from a vmaddfp: 5094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown load -0.0 (0x8000_0000) to each 32-bit word of vB 5095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this makes the add a noop. 5096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 5097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt vB = 29; // XXX: Using v29 for temp do not change 5098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // without also changing 5099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // getRegUsage_PPCInstr 5100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt konst = 0x1F; 5101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Better way to load -0.0 (0x80000000) ? 5103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // vspltisw vB,0x1F (0x1F => each word of vB) 5104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, vB, konst, 0, 908 ); 5105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // vslw vB,vB,vB (each word of vB = (0x1F << 0x1F) = 0x80000000 5107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, vB, vB, vB, 388 ); 5108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Finally, do the multiply: 5110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVA( p, 4, v_dst, v_srcL, vB, v_srcR, 46 ); 5111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 5112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPEQF: // vcmpeqfp 5114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 198 ); 5115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 5116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPGTF: // vcmpgtfp 5117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 710 ); 5118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 5119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CMPGEF: // vcmpgefp 5120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVXR( p, 4, v_dst, v_srcL, v_srcR, 0, 454 ); 5121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown break; 5122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 5124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 5125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 5127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvUn32Fx4: { 5130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvUn32Fx4.dst); 5131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src = vregNo(i->Pin.AvUn32Fx4.src); 5132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt opc2; 5133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown switch (i->Pin.AvUn32Fx4.op) { 5134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_RCPF: opc2 = 266; break; // vrefp 5135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_RSQRTF: opc2 = 330; break; // vrsqrtefp 5136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CVTU2F: opc2 = 778; break; // vcfux 5137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_CVTS2F: opc2 = 842; break; // vcfsx 5138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_QCVTF2U: opc2 = 906; break; // vctuxs 5139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_QCVTF2S: opc2 = 970; break; // vctsxs 5140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDM: opc2 = 714; break; // vrfim 5141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDP: opc2 = 650; break; // vrfip 5142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDN: opc2 = 522; break; // vrfin 5143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pavfp_ROUNDZ: opc2 = 586; break; // vrfiz 5144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 5145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 5146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, 0, v_src, opc2 ); 5148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 5149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvPerm: { // vperm 5152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvPerm.dst); 5153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvPerm.srcL); 5154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvPerm.srcR); 5155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_ctl = vregNo(i->Pin.AvPerm.ctl); 5156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, v_ctl, 43 ); 5157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 5158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSel: { // vsel 5161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_ctl = vregNo(i->Pin.AvSel.ctl); 5162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvSel.dst); 5163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvSel.srcL); 5164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvSel.srcR); 5165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, v_ctl, 42 ); 5166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 5167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvShlDbl: { // vsldoi 5170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt shift = i->Pin.AvShlDbl.shift; 5171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvShlDbl.dst); 5172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcL = vregNo(i->Pin.AvShlDbl.srcL); 5173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_srcR = vregNo(i->Pin.AvShlDbl.srcR); 5174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(shift <= 0xF); 5175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVA( p, 4, v_dst, v_srcL, v_srcR, shift, 44 ); 5176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 5177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvSplat: { // vsplt(is)(b,h,w) 5180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvShlDbl.dst); 5181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar sz = i->Pin.AvSplat.sz; 5182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src, opc2; 5183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(sz == 8 || sz == 16 || sz == 32); 5184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (i->Pin.AvSplat.src->tag == Pvi_Imm) { 5186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char simm5; 5187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = (sz == 8) ? 780 : (sz == 16) ? 844 : 908; // 8,16,32 5188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* expects 5-bit-signed-imm */ 5189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown simm5 = i->Pin.AvSplat.src->Pvi.Imm5s; 5190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(simm5 >= -16 && simm5 <= 15); 5191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown simm5 = simm5 & 0x1F; 5192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, (UInt)simm5, 0, opc2 ); 5193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else { // Pri_Reg 5195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt lowest_lane; 5196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opc2 = (sz == 8) ? 524 : (sz == 16) ? 588 : 652; // 8,16,32 5197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(hregClass(i->Pin.AvSplat.src->Pvi.Reg) == HRcVec128); 5198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown v_src = vregNo(i->Pin.AvSplat.src->Pvi.Reg); 5199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lowest_lane = (128/sz)-1; 5200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, lowest_lane, v_src, opc2 ); 5201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 5203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvCMov: { 5206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_dst = vregNo(i->Pin.AvCMov.dst); 5207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src = vregNo(i->Pin.AvCMov.src); 5208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PPCCondCode cc = i->Pin.AvCMov.cond; 5209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (v_dst == v_src) goto done; 5211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vassert(cc.test != Pct_ALWAYS); 5213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* jmp fwds 2 insns if !condition */ 5215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (cc.test != Pct_ALWAYS) { 5216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* bc !ct,cf,n_bytes>>2 */ 5217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormB(p, invertCondTest(cc.test), cc.flag, 8>>2, 0, 0); 5218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* vmr */ 5220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, v_dst, v_src, v_src, 1156 ); 5221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 5222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown case Pin_AvLdVSCR: { // mtvscr 5225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt v_src = vregNo(i->Pin.AvLdVSCR.src); 5226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown p = mkFormVX( p, 4, 0, 0, v_src, 1604 ); 5227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto done; 5228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Unary: { 5231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo( i->Pin.FpUnary.dst ); 5232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo( i->Pin.FpUnary.src ); 5233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp64Unary.op) { 5235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_MOV: // fmr, PPC32 p410 5236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, fr_dst, 0, fr_src, 72, 0 ); 5237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTDP: // D32 to D64 5239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 258, 0 ); 5240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DRSP: // D64 to D32 5242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 770, 0 ); 5243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCFFIX: // I64 to D64 conversion 5245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ONLY WORKS ON POWER7 */ 5246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 802, 0); 5247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTFIX: // D64 to I64 conversion 5249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 290, 0); 5250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DXEX: // Extract exponent 5252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, 0, fr_src, 354, 0 ); 5253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Binary: { 5261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo( i->Pin.Dfp64Binary.dst ); 5262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo( i->Pin.Dfp64Binary.srcL ); 5263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo( i->Pin.Dfp64Binary.srcR ); 5264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp64Binary.op) { 5265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPADD: /* dadd, dfp add, use default RM from reg ignore mode 5266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * from the Iop instruction. */ 5267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 2, 0 ); 5268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPSUB: /* dsub, dfp subtract, use default RM from reg ignore 5270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * mode from the Iop instruction. */ 5271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 514, 0 ); 5272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPMUL: /* dmul, dfp multipy, use default RM from reg ignore 5274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * mode from the Iop instruction. */ 5275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 34, 0 ); 5276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPDIV: /* ddiv, dfp divide, use default RM from reg ignore 5278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * mode from the Iop instruction. */ 5279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 546, 0 ); 5280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DIEX: /* diex, insert exponent */ 5282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 59, fr_dst, fr_srcL, fr_srcR, 866, 0 ); 5283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift: { 5291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Pin.DfpShift.src); 5292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Pin.DfpShift.dst); 5293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt shift; 5294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng shift = i->Pin.DfpShift.shift->Pri.Imm; 5296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.DfpShift.op) { 5298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DSCLI: /* dscli, DFP shift left by fr_srcR */ 5299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ22( p, 59, fr_dst, fr_src, shift, 66, 0 ); 5300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DSCRI: /* dscri, DFP shift right by fr_srcR */ 5302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ22( p, 59, fr_dst, fr_src, shift, 98, 0 ); 5303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ERROR: emit_PPCInstr default case\n"); 5306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ExtractExpD128: { 5312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Pin.ExtractExpD128.dst); 5313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcHi = fregNo(i->Pin.ExtractExpD128.src_hi); 5314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcLo = fregNo(i->Pin.ExtractExpD128.src_lo); 5315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.ExtractExpD128.op) { 5317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DXEXQ: 5318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 12, 0, fr_srcHi, 72, 0); 5322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 13, 0, fr_srcLo, 72, 0); 5323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, 12, 354, 0 ); 5324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 64-bit result in 5326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register 10. 5327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst, 0, 10, 72, 0); 5329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("Error: emit_PPCInstr case Pin_DfpExtractExp, case inst Default\n"); 5332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Unary: { 5337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo(i->Pin.Dfp128Unary.dst_hi); 5338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo(i->Pin.Dfp128Unary.dst_lo); 5339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcLo = fregNo(i->Pin.Dfp128Unary.src_lo); 5340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do instruction with 128-bit source operands in registers (10,11) 5342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * and (12,13). 5343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp128Unary.op) { 5345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTQPQ: // D64 to D128, srcLo holds 64 bit operand 5346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 12, 0, fr_srcLo, 72, 0); 5347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, 12, 258, 0 ); 5349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result in 5351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("Error: emit_PPCInstr case Pin_Dfp128Unary, case inst Default\ 5359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng\n"); 5360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Binary: { 5366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* dst is used to supply the left source operand and return 5367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * the result. 5368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo( i->Pin.Dfp128Binary.dst_hi ); 5370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo( i->Pin.Dfp128Binary.dst_lo ); 5371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcRHi = fregNo( i->Pin.Dfp128Binary.srcR_hi ); 5372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcRLo = fregNo( i->Pin.Dfp128Binary.srcR_lo ); 5373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, fr_dstHi, 72, 0 ); 5378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 11, 0, fr_dstLo, 72, 0 ); 5379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 12, 0, fr_srcRHi, 72, 0 ); 5380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 13, 0, fr_srcRLo, 72, 0 ); 5381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do instruction with 128-bit source operands in registers (10,11) 5383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * and (12,13). 5384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp128Binary.op) { 5386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPADDQ: 5387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 10, 12, 2, 0 ); 5388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPSUBQ: 5390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 10, 12, 514, 0 ); 5391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPMULQ: 5393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 10, 12, 34, 0 ); 5394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DFPDIVQ: 5396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 10, 12, 546, 0 ); 5397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result in 5403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpShift128: { 5412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src_hi = fregNo(i->Pin.DfpShift128.src_hi); 5413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src_lo = fregNo(i->Pin.DfpShift128.src_lo); 5414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst_hi = fregNo(i->Pin.DfpShift128.dst_hi); 5415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst_lo = fregNo(i->Pin.DfpShift128.dst_lo); 5416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt shift; 5417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng shift = i->Pin.DfpShift128.shift->Pri.Imm; 5419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* setup source operand in register 12, 13 pair */ 5421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_src_hi, 72, 0); 5422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_src_lo, 72, 0); 5423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* execute instruction putting result in register 10, 11 pair */ 5425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.DfpShift128.op) { 5426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DSCLIQ: /* dscliq, DFP shift left, fr_srcR is the integer 5427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * shift amount. 5428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ22( p, 63, 10, 12, shift, 66, 0 ); 5430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DSCRIQ: /* dscriq, DFP shift right, fr_srcR is the integer 5432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * shift amount. 5433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ22( p, 63, 10, 12, shift, 98, 0 ); 5435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ERROR: emit_PPCInstr quad default case %d \n", 5438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.DfpShift128.op); 5439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction put the 128-bit result in registers (10,11). 5443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Note, the operand in the instruction only reference the first of 5444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * the two registers in the pair. 5445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst_hi, 0, 10, 72, 0); 5447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst_lo, 0, 11, 72, 0); 5448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound: { 5452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Pin.DfpRound.dst); 5453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Pin.DfpRound.src); 5454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_rmc, r, rmc; 5455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_rmc = i->Pin.DfpRound.r_rmc->Pri.Imm; 5457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r = (r_rmc & 0x8) >> 3; 5458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rmc = r_rmc & 0x3; 5459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // drintx 5461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 59, fr_dst, r, fr_src, rmc, 99, 0); 5462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpRound128: { 5466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo(i->Pin.DfpRound128.dst_hi); 5467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo(i->Pin.DfpRound128.dst_lo); 5468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcHi = fregNo(i->Pin.DfpRound128.src_hi); 5469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcLo = fregNo(i->Pin.DfpRound128.src_lo); 5470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_rmc, r, rmc; 5471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_rmc = i->Pin.DfpRound128.r_rmc->Pri.Imm; 5473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r = (r_rmc & 0x8) >> 3; 5474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rmc = r_rmc & 0x3; 5475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_srcHi, 72, 0); 5480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_srcLo, 72, 0); 5481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do drintx instruction with 128-bit source operands in 5483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (12,13). 5484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 63, 10, r, 12, rmc, 99, 0); 5486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result in 5488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize: { 5497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Pin.DfpQuantize.dst); 5498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Pin.DfpQuantize.srcL); 5499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Pin.DfpQuantize.srcR); 5500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt rmc; 5501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rmc = i->Pin.DfpQuantize.rmc->Pri.Imm; 5503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.DfpQuantize.op) { 5505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DQUA: 5506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 59, fr_dst, fr_srcL, fr_srcR, rmc, 3, 0); 5507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_RRDTR: 5509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 59, fr_dst, fr_srcL, fr_srcR, rmc, 35, 0); 5510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpQuantize128: { 5518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst_hi = fregNo(i->Pin.DfpQuantize128.dst_hi); 5519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst_lo = fregNo(i->Pin.DfpQuantize128.dst_lo); 5520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src_hi = fregNo(i->Pin.DfpQuantize128.src_hi); 5521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src_lo = fregNo(i->Pin.DfpQuantize128.src_lo); 5522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt rmc; 5523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rmc = i->Pin.DfpQuantize128.rmc->Pri.Imm; 5525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pairs. Note, left source operand passed in via the 5527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * dst register pair. 5528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 10, 0, fr_dst_hi, 72, 0); 5530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 11, 0, fr_dst_lo, 72, 0); 5531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_src_hi, 72, 0); 5532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_src_lo, 72, 0); 5533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do dquaq instruction with 128-bit source operands in 5535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (12,13). 5536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.DfpQuantize128.op) { 5538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DQUAQ: 5539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 63, 10, 10, 12, rmc, 3, 0); 5540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DRRNDQ: 5542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormZ23(p, 63, 10, 10, 12, rmc, 35, 0); 5543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("Pin_DfpQuantize128: default case, couldn't find inst to issue \n"); 5546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result in 5550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst_hi, 0, 10, 72, 0); 5554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst_lo, 0, 11, 72, 0); 5555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpD128toD64: { 5559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo( i->Pin.DfpD128toD64.dst ); 5560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcHi = fregNo( i->Pin.DfpD128toD64.src_hi ); 5561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcLo = fregNo( i->Pin.DfpD128toD64.src_lo ); 5562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, fr_dst, 72, 0 ); 5567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 12, 0, fr_srcHi, 72, 0 ); 5568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 13, 0, fr_srcLo, 72, 0 ); 5569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Do instruction with 128-bit source operands in registers (10,11) */ 5571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp128Binary.op) { 5572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DRDPQ: 5573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, 12, 770, 0 ); 5574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCTFIXQ: 5576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 0, 12, 290, 0 ); 5577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 64-bit result in registers 10. */ 5583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dst, 0, 10, 72, 0); 5584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_DfpI64StoD128: { 5588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo( i->Pin.DfpI64StoD128.dst_hi ); 5589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo( i->Pin.DfpI64StoD128.dst_lo ); 5590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo( i->Pin.DfpI64StoD128.src ); 5591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Pin.Dfp128Binary.op) { 5593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pfp_DCFFIXQ: 5594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX( p, 63, 10, 11, fr_src, 802, 0 ); 5595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 5596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 5597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 5598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 64-bit result in registers 10, 11. */ 5601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_InsertExpD128: { 5607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstHi = fregNo(i->Pin.InsertExpD128.dst_hi); 5608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dstLo = fregNo(i->Pin.InsertExpD128.dst_lo); 5609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Pin.InsertExpD128.srcL); 5610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcRHi = fregNo(i->Pin.InsertExpD128.srcR_hi); 5611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcRLo = fregNo(i->Pin.InsertExpD128.srcR_lo); 5612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The left operand is a single F64 value, the right is an F128 5614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 10, 0, fr_srcL, 72, 0); 5617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_srcRHi, 72, 0); 5618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_srcRLo, 72, 0); 5619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 10, 10, 12, 866, 0 ); 5620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* The instruction will put the 128-bit result into 5622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * registers (10,11). Note, the operand in the instruction only 5623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * reference the first of the two registers in the pair. 5624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstHi, 0, 10, 72, 0); 5626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, fr_dstLo, 0, 11, 72, 0); 5627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp64Cmp:{ 5631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar crfD = 1; 5632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Pin.Dfp64Cmp.dst, mode64); 5633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Pin.Dfp64Cmp.srcL); 5634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Pin.Dfp64Cmp.srcR); 5635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(crfD < 8); 5636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // dcmpo, dcmpu 5637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 59, crfD<<2, fr_srcL, fr_srcR, 130, 0); 5638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // mfcr (mv CR to r_dst) 5640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 31, r_dst, 0, 0, 19, 0); 5641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // rlwinm r_dst,r_dst,8,28,31 5643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // => rotate field 1 to bottomw of word, masking out upper 28 5644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0); 5645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_Dfp128Cmp: { 5649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar crfD = 1; 5650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Pin.Dfp128Cmp.dst, mode64); 5651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL_hi = fregNo(i->Pin.Dfp128Cmp.srcL_hi); 5652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL_lo = fregNo(i->Pin.Dfp128Cmp.srcL_lo); 5653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR_hi = fregNo(i->Pin.Dfp128Cmp.srcR_hi); 5654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR_lo = fregNo(i->Pin.Dfp128Cmp.srcR_lo); 5655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(crfD < 8); 5656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // dcmpoq, dcmpuq 5657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Setup the upper and lower registers of the source operand 5658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * register pair. 5659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 10, 0, fr_srcL_hi, 72, 0); 5661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 11, 0, fr_srcL_lo, 72, 0); 5662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 12, 0, fr_srcR_hi, 72, 0); 5663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, 13, 0, fr_srcR_lo, 72, 0); 5664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 63, crfD<<2, 10, 12, 130, 0); 5666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // mfcr (mv CR to r_dst) 5668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormX(p, 31, r_dst, 0, 0, 19, 0); 5669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // rlwinm r_dst,r_dst,8,28,31 5671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // => rotate field 1 to bottomw of word, masking out upper 28 5672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormM(p, 21, r_dst, r_dst, 8, 28, 31, 0); 5673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_EvCheck: { 5677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* This requires a 32-bit dec/test in both 32- and 64-bit 5678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng modes. */ 5679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We generate: 5680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lwz r30, amCounter 5681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addic. r30, r30, -1 5682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng stw r30, amCounter 5683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bge nofail 5684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lwz/ld r30, amFailAddr 5685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctr 5687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nofail: 5688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p0 = p; 5690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lwz r30, amCounter */ 5691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_word32(p, True/*isLoad*/, /*r*/30, 5692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amCounter, mode64); 5693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addic. r30,r30,-1 */ 5694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x37DEFFFF); 5695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* stw r30, amCounter */ 5696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_word32(p, False/*!isLoad*/, /*r*/30, 5697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amCounter, mode64); 5698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bge nofail */ 5699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x40800010); 5700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lwz/ld r30, amFailAddr */ 5701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word(p, True/*isLoad*/, /*r*/30, 5702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Pin.EvCheck.amFailAddr, mode64); 5703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtctr r30 */ 5704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXFX(p, /*r*/30, 9, 467); 5705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bctr */ 5706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormXL(p, 19, Pct_ALWAYS, 0, 0, 528, 0); 5707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nofail: */ 5708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Crosscheck */ 5710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(evCheckSzB_PPC() == (UChar*)p - (UChar*)p0); 5711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Pin_ProfInc: { 5715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We generate: 5716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (ctrP is unknown now, so use 0x65556555(65556555) in the 5717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng expectation that a later call to LibVEX_patchProfCtr 5718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng will be used to fill in the immediate fields once the 5719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng right value is known.) 5720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 32-bit: 5721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32-exactly r30, 0x65556555 5722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lwz r29, 4(r30) 5723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addic. r29, r29, 1 5724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng stw r29, 4(r30) 5725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lwz r29, 0(r30) 5726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addze r29, r29 5727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng stw r29, 0(r30) 5728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 64-bit: 5729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm64-exactly r30, 0x6555655565556555 5730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ld r29, 0(r30) 5731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addi r29, r29, 1 5732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng std r29, 0(r30) 5733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 5735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5( 5736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, /*r*/30, 0x6555655565556555ULL, True/*mode64*/); 5737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0xEBBE0000); 5738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x3BBD0001); 5739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0xFBBE0000); 5740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 5741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5( 5742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p, /*r*/30, 0x65556555ULL, False/*!mode64*/); 5743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x83BE0004); 5744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x37BD0001); 5745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x93BE0004); 5746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x83BE0000); 5747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x7FBD0194); 5748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x93BE0000); 5749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Tell the caller .. */ 5751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!(*is_profInc)); 5752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *is_profInc = True; 5753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 5754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown default: 5757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown goto bad; 5758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 5759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bad: 5761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vex_printf("\n=> "); 5762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppPPCInstr(i, mode64); 5763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vpanic("emit_PPCInstr"); 5764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*NOTREACHED*/ 5765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown done: 5767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(p - &buf[0] <= 64); 5768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return p - &buf[0]; 5769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 5770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check? See case for Pin_EvCheck in 5773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emit_PPCInstr just above. That crosschecks what this returns, so 5774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we can tell if we're inconsistent. */ 5775663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt evCheckSzB_PPC ( void ) 5776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 5777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 28; 5778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 5779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the 5782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emitInstr case for XDirect, above. */ 5783663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange chainXDirect_PPC ( void* place_to_chain, 5784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_EXPECTED, 5785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to, 5786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 5787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 5788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* What we're expecting to see is: 5789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32/64-fixed r30, disp_cp_chain_me_to_EXPECTED 5790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctrl 5792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 5793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 5794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 7F C9 03 A6 5795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4E 80 04 21 5796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_chain; 5798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 5799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/30, 5800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(disp_cp_chain_me_EXPECTED), 5801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64)); 5802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x7FC903A6); 5803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x4E800421); 5804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* And what we want to change it to is: 5805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32/64-fixed r30, place_to_jump_to 5806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctr 5808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 5809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 5810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 7F C9 03 A6 5811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4E 80 04 20 5812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The replacement has the same length as the original. 5813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/30, 5815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(place_to_jump_to), mode64); 5816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x7FC903A6); 5817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x4E800420); 5818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = p - (UChar*)place_to_chain; 5820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == (mode64 ? 28 : 16)); /* stay sane */ 5821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_chain, len}; 5822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 5823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 5824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the 5827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emitInstr case for XDirect, above. */ 5828663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange unchainXDirect_PPC ( void* place_to_unchain, 5829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to_EXPECTED, 5830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me, 5831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 5832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 5833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* What we're expecting to see is: 5834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32/64-fixed r30, place_to_jump_to_EXPECTED 5835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctr 5837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 5838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 5839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 7F C9 03 A6 5840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4E 80 04 20 5841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_unchain; 5843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 5844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/30, 5845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(place_to_jump_to_EXPECTED), 5846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64)); 5847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x7FC903A6); 5848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x4E800420); 5849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* And what we want to change it to is: 5850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm32/64-fixed r30, disp_cp_chain_me 5851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mtctr r30 5852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bctrl 5853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 5854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 5855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 7F C9 03 A6 5856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4E 80 04 21 5857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The replacement has the same length as the original. 5858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 5859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/30, 5860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(disp_cp_chain_me), mode64); 5861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x7FC903A6); 5862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x4E800421); 5863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = p - (UChar*)place_to_unchain; 5865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == (mode64 ? 28 : 16)); /* stay sane */ 5866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_unchain, len}; 5867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 5868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 5869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter address into a profile inc point, as previously 5872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng created by the Pin_ProfInc case for emit_PPCInstr. */ 5873663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange patchProfInc_PPC ( void* place_to_patch, 5874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ULong* location_of_counter, 5875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 5876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 5877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_patch; 5878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 5879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = 0; 5881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 5882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/30, 5883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x6555655565556555ULL, True/*mode64*/)); 5884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 20) == 0xEBBE0000); 5885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 24) == 0x3BBD0001); 5886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 28) == 0xFBBE0000); 5887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/30, 5888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(location_of_counter), 5889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng True/*mode64*/); 5890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng len = p - (UChar*)place_to_patch; 5891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == 20); 5892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 5893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/30, 5894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x65556555ULL, False/*!mode64*/)); 5895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 8) == 0x83BE0004); 5896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 12) == 0x37BD0001); 5897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 16) == 0x93BE0004); 5898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 20) == 0x83BE0000); 5899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 24) == 0x7FBD0194); 5900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + 28) == 0x93BE0000); 5901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/30, 5902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(location_of_counter), 5903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng False/*!mode64*/); 5904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng len = p - (UChar*)place_to_patch; 5905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == 8); 5906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 5907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_patch, len}; 5908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 5909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 5910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 5913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end host_ppc_defs.c ---*/ 5914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 5915