1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---------------------------------------------------------------*/ 3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- begin host_mips_defs.c ---*/ 4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---------------------------------------------------------------*/ 5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* 7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng This file is part of Valgrind, a dynamic binary instrumentation 8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng framework. 9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Copyright (C) 2010-2012 RT-RK 11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mips-valgrind@rt-rk.com 12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng This program is free software; you can redistribute it and/or 14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng modify it under the terms of the GNU General Public License as 15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng published by the Free Software Foundation; either version 2 of the 16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng License, or (at your option) any later version. 17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng This program is distributed in the hope that it will be useful, but 19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng WITHOUT ANY WARRANTY; without even the implied warranty of 20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng General Public License for more details. 22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng You should have received a copy of the GNU General Public License 24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng along with this program; if not, write to the Free Software 25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 02111-1307, USA. 27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The GNU General Public License is contained in the file COPYING. 29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/ 30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "libvex_basictypes.h" 32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "libvex.h" 33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "libvex_trc_values.h" 34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "main_util.h" 36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "host_generic_regs.h" 37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "host_mips_defs.h" 38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---------------- Registers ----------------*/ 40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid ppHRegMIPS(HReg reg, Bool mode64) 42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int r; 44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng static HChar *ireg32_names[35] 45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng = { "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31", 49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "%32", "%33", "%34", 50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng }; 51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng static HChar *freg32_names[32] 53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng = { "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", 54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", 55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", 56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "f30", "$f31" 57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng }; 58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng static HChar *freg64_names[32] 60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng = { "$d0", "$d1", "$d2", "$d3", "$d4", "$d5", "$d6", "$d7", 61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$d8", "$d9", "$d10", "$d11", "$d12", "$d13", "$d14", "$d15", 62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng }; 63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Be generic for all virtual regs. */ 65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (hregIsVirtual(reg)) { 66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHReg(reg); 67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* But specific for real regs. */ 71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(hregClass(reg) == HRcInt32 || hregClass(reg) == HRcInt64 || 72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng hregClass(reg) == HRcFlt32 || hregClass(reg) == HRcFlt64); 73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* But specific for real regs. */ 75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (hregClass(reg)) { 77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcInt32: 78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r = hregNumber(reg); 79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r >= 0 && r < 32); 80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s", ireg32_names[r]); 81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt32: 83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r = hregNumber(reg); 84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r >= 0 && r < 32); 85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s", freg32_names[r]); 86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt64: 88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r = hregNumber(reg); 89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r >= 0 && r < 32); 90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s", freg64_names[r]); 91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("ppHRegMIPS"); 94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define MkHRegGPR(_n, _mode64) \ 102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mkHReg(_n, _mode64 ? HRcInt64 : HRcInt32, False) 103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 104663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR0(Bool mode64) 105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(0, mode64); 107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 109663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR1(Bool mode64) 110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(1, mode64); 112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 114663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR2(Bool mode64) 115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(2, mode64); 117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 119663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR3(Bool mode64) 120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(3, mode64); 122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 124663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR4(Bool mode64) 125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(4, mode64); 127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 129663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR5(Bool mode64) 130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(5, mode64); 132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 134663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR6(Bool mode64) 135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(6, mode64); 137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 139663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR7(Bool mode64) 140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(7, mode64); 142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 144663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR8(Bool mode64) 145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(8, mode64); 147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 149663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR9(Bool mode64) 150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(9, mode64); 152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 154663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR10(Bool mode64) 155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(10, mode64); 157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 159663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR11(Bool mode64) 160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(11, mode64); 162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 164663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR12(Bool mode64) 165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(12, mode64); 167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 169663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR13(Bool mode64) 170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(13, mode64); 172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 174663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR14(Bool mode64) 175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(14, mode64); 177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 179663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR15(Bool mode64) 180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(15, mode64); 182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 184663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR16(Bool mode64) 185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(16, mode64); 187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 189663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR17(Bool mode64) 190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(17, mode64); 192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 194663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR18(Bool mode64) 195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(18, mode64); 197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 199663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR19(Bool mode64) 200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(19, mode64); 202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 204663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR20(Bool mode64) 205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(20, mode64); 207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 209663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR21(Bool mode64) 210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(21, mode64); 212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 214663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR22(Bool mode64) 215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(22, mode64); 217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 219663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR23(Bool mode64) 220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(23, mode64); 222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 224663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR24(Bool mode64) 225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(24, mode64); 227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 229663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR25(Bool mode64) 230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(25, mode64); 232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 234663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR26(Bool mode64) 235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(26, mode64); 237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 239663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR27(Bool mode64) 240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(27, mode64); 242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 244663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR28(Bool mode64) 245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(28, mode64); 247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 249663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR29(Bool mode64) 250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(29, mode64); 252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 254663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR30(Bool mode64) 255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(30, mode64); 257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 259663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR31(Bool mode64) 260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(31, mode64); 262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define MkHRegFPR(_n, _mode64) \ 265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mkHReg(_n, _mode64 ? HRcFlt64 : HRcFlt32, False) 266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 267663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F0(Bool mode64) 268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(0, mode64); 270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 272663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F1(Bool mode64) 273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(1, mode64); 275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 277663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F2(Bool mode64) 278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(2, mode64); 280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 282663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F3(Bool mode64) 283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(3, mode64); 285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 287663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F4(Bool mode64) 288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(4, mode64); 290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 292663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F5(Bool mode64) 293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(5, mode64); 295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 297663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F6(Bool mode64) 298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(6, mode64); 300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 302663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F7(Bool mode64) 303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(7, mode64); 305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 307663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F8(Bool mode64) 308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(8, mode64); 310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 312663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F9(Bool mode64) 313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(9, mode64); 315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 317663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F10(Bool mode64) 318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(10, mode64); 320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 322663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F11(Bool mode64) 323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(11, mode64); 325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 327663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F12(Bool mode64) 328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(12, mode64); 330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 332663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F13(Bool mode64) 333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(13, mode64); 335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 337663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F14(Bool mode64) 338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(14, mode64); 340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 342663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F15(Bool mode64) 343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(15, mode64); 345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 347663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F16(Bool mode64) 348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(16, mode64); 350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 352663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F17(Bool mode64) 353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(17, mode64); 355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 357663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F18(Bool mode64) 358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(18, mode64); 360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 362663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F19(Bool mode64) 363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(19, mode64); 365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 367663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F20(Bool mode64) 368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(20, mode64); 370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 372663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F21(Bool mode64) 373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(21, mode64); 375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 377663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F22(Bool mode64) 378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(22, mode64); 380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 382663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F23(Bool mode64) 383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(23, mode64); 385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 387663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F24(Bool mode64) 388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(24, mode64); 390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 392663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F25(Bool mode64) 393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(25, mode64); 395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 397663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F26(Bool mode64) 398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(26, mode64); 400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 402663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F27(Bool mode64) 403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(27, mode64); 405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 407663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F28(Bool mode64) 408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(28, mode64); 410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 412663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F29(Bool mode64) 413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(29, mode64); 415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 417663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F30(Bool mode64) 418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(30, mode64); 420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 422663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F31(Bool mode64) 423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(31, mode64); 425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 427663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_PC(Bool mode64) 428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(32, mode64 ? HRcFlt64 : HRcFlt32, False); 430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 432663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_HI(Bool mode64) 433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(33, mode64 ? HRcFlt64 : HRcFlt32, False); 435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 437663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_LO(Bool mode64) 438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(34, mode64 ? HRcFlt64 : HRcFlt32, False); 440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 442663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D0(void) 443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(0, HRcFlt64, False); 445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 447663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D1(void) 448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(2, HRcFlt64, False); 450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 452663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D2(void) 453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(4, HRcFlt64, False); 455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 457663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D3(void) 458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(6, HRcFlt64, False); 460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 462663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D4(void) 463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(8, HRcFlt64, False); 465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 467663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D5(void) 468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(10, HRcFlt64, False); 470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 472663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D6(void) 473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(12, HRcFlt64, False); 475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 477663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D7(void) 478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(14, HRcFlt64, False); 480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 482663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D8(void) 483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(16, HRcFlt64, False); 485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 487663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D9(void) 488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(18, HRcFlt64, False); 490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 492663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D10(void) 493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(20, HRcFlt64, False); 495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 497663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D11(void) 498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(22, HRcFlt64, False); 500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 502663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D12(void) 503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(24, HRcFlt64, False); 505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 507663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D13(void) 508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(26, HRcFlt64, False); 510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 512663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D14(void) 513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(28, HRcFlt64, False); 515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 517663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D15(void) 518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(30, HRcFlt64, False); 520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 522663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FIR(void) 523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(35, HRcInt32, False); 525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 527663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FCCR(void) 528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(36, HRcInt32, False); 530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 532663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FEXR(void) 533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(37, HRcInt32, False); 535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 537663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FENR(void) 538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(38, HRcInt32, False); 540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 542663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FCSR(void) 543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(39, HRcInt32, False); 545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 547663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_COND(void) 548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(47, HRcInt32, False); 550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid getAllocableRegs_MIPS(Int * nregs, HReg ** arr, Bool mode64) 553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) 555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *nregs = 27; 556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *nregs = 34; 558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt i = 0; 559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *arr = LibVEX_Alloc(*nregs * sizeof(HReg)); 560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //ZERO = constant 0 562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //AT = assembler temporary 563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // callee saves ones are listed first, since we prefer them 564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // if they're available 565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR16(mode64); 566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR17(mode64); 567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR18(mode64); 568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR19(mode64); 569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR20(mode64); 570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR21(mode64); 571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR22(mode64); 572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) 573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR23(mode64); 574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // otherwise we'll have to slum it out with caller-saves ones 576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR8(mode64); 578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR9(mode64); 579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR10(mode64); 580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR11(mode64); 581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR12(mode64); 583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR13(mode64); 584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR14(mode64); 585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR15(mode64); 586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR24(mode64); 587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /***********mips32********************/ 588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // t0 (=dispatch_ctr) 589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // t1 spill reg temp 590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // t2 (=guest_state) 591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // t3 (=PC = next guest address) 592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // K0 and K1 are reserved for OS kernel 593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // GP = global pointer 594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // SP = stack pointer 595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // FP = frame pointer 596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // RA = link register 597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // + PC, HI and LO 598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F20(mode64); 599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F21(mode64); 600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F22(mode64); 601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F23(mode64); 602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F24(mode64); 603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F25(mode64); 604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F26(mode64); 605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F27(mode64); 606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F28(mode64); 607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F29(mode64); 608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F30(mode64); 609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fake double floating point */ 611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D0(); 612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D1(); 613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D2(); 614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D3(); 615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D4(); 616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D5(); 617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D6(); 618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D7(); 619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D8(); 620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D9(); 621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i == *nregs); 623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*----------------- Condition Codes ----------------------*/ 627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 628663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHChar *showMIPSCondCode(MIPSCondCode cond) 629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HChar* ret; 631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (cond) { 632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_EQ: 633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "EQ"; /* equal */ 634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_NE: 636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "NEQ"; /* not equal */ 637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_HS: 639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "GE"; /* >=u (Greater Than or Equal) */ 640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LO: 642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "LT"; /* <u (lower) */ 643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_MI: 645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "mi"; /* minus (negative) */ 646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_PL: 648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "pl"; /* plus (zero or +ve) */ 649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_VS: 651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "vs"; /* overflow */ 652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_VC: 654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "vc"; /* no overflow */ 655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_HI: 657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "hi"; /* >u (higher) */ 658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LS: 660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "ls"; /* <=u (lower or same) */ 661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_GE: 663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "ge"; /* >=s (signed greater or equal) */ 664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LT: 666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "lt"; /* <s (signed less than) */ 667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_GT: 669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "gt"; /* >s (signed greater) */ 670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LE: 672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "le"; /* <=s (signed less or equal) */ 673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_AL: 675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "al"; /* always (unconditional) */ 676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_NV: 678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "nv"; /* never (unconditional): */ 679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSCondCode"); 682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 687663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHChar *showMIPSFpOp(MIPSFpOp op) 688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HChar *ret; 690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ADDD: 692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "ADD.D"; 693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SUBD: 695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "SUB.D"; 696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MULD: 698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "MUL.D"; 699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_DIVD: 701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "DIV.D"; 702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MADDD: 704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "MADD.D"; 705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MSUBD: 707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "MSUB.D"; 708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MADDS: 710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "MADD.S"; 711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MSUBS: 713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "MSUB.S"; 714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ADDS: 716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "ADD.S"; 717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SUBS: 719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "SUB.S"; 720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MULS: 722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "MUL.S"; 723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_DIVS: 725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "DIV.S"; 726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SQRTS: 728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "SQRT.S"; 729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SQRTD: 731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "SQRT.D"; 732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RSQRTS: 734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "RSQRT.S"; 735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RSQRTD: 737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "RSQRT.D"; 738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RECIPS: 740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "RECIP.S"; 741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RECIPD: 743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "RECIP.D"; 744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ABSS: 746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "ABS.S"; 747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ABSD: 749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "ABS.D"; 750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_NEGS: 752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "NEG.S"; 753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_NEGD: 755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "NEG.D"; 756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MOVS: 758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "MOV.S"; 759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MOVD: 761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "MOV.D"; 762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RES: 764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "RES"; 765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ROUNDWS: 767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "ROUND.W.S"; 768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ROUNDWD: 770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "ROUND.W.D"; 771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_FLOORWS: 773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "FLOOR.W.S"; 774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_FLOORWD: 776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "FLOOR.W.D"; 777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RSQRTE: 779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "frsqrte"; 780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTDW: 782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTD: 783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "CVT.D"; 784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTSD: 786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTSW: 787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "CVT.S"; 788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTWS: 790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTWD: 791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "CVT.W"; 792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRUWD: 794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRUWS: 795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "TRUNC.W"; 796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRULD: 798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRULS: 799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "TRUNC.L"; 800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILWS: 802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILWD: 803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "CEIL.W"; 804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILLS: 806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILLD: 807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "CEIL.L"; 808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CMP: 810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "C.cond.d"; 811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSFpOp"); 814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- MIPSAMode: memory address expressions. --------- */ 820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 821663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *MIPSAMode_IR(Int idx, HReg base) 822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am = LibVEX_Alloc(sizeof(MIPSAMode)); 824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->tag = Mam_IR; 825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.IR.base = base; 826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.IR.index = idx; 827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return am; 829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 831663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *MIPSAMode_RR(HReg idx, HReg base) 832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am = LibVEX_Alloc(sizeof(MIPSAMode)); 834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->tag = Mam_RR; 835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.RR.base = base; 836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.RR.index = idx; 837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return am; 839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 841663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *dopyMIPSAMode(MIPSAMode * am) 842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode* ret; 844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = MIPSAMode_IR(am->Mam.IR.index, am->Mam.IR.base); 847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = MIPSAMode_RR(am->Mam.RR.index, am->Mam.RR.base); 850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("dopyMIPSAMode"); 853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 858663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *nextMIPSAModeFloat(MIPSAMode * am) 859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode* ret; 861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = MIPSAMode_IR(am->Mam.IR.index + 8, am->Mam.IR.base); 864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = MIPSAMode_RR(am->Mam.RR.index + 1, am->Mam.RR.base); 867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("dopyMIPSAMode"); 870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 875663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *nextMIPSAModeInt(MIPSAMode * am) 876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode* ret; 878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = MIPSAMode_IR(am->Mam.IR.index + 4, am->Mam.IR.base); 881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = MIPSAMode_RR(am->Mam.RR.index + 1, am->Mam.RR.base); 884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("dopyMIPSAMode"); 887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid ppMIPSAMode(MIPSAMode * am, Bool mode64) 893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am->Mam.IR.index == 0) 897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("0("); 898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%d(", (Int) am->Mam.IR.index); 900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(am->Mam.IR.base, mode64); 901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(")"); 902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(am->Mam.RR.base, mode64); 905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(am->Mam.RR.index, mode64); 907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("ppMIPSAMode"); 910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void addRegUsage_MIPSAMode(HRegUsage * u, MIPSAMode * am) 915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, am->Mam.IR.base); 919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, am->Mam.RR.base); 922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, am->Mam.RR.index); 923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("addRegUsage_MIPSAMode"); 926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void mapRegs_MIPSAMode(HRegRemap * m, MIPSAMode * am) 931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.IR.base = lookupHRegRemap(m, am->Mam.IR.base); 935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.RR.base = lookupHRegRemap(m, am->Mam.RR.base); 938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.RR.index = lookupHRegRemap(m, am->Mam.RR.index); 939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("mapRegs_MIPSAMode"); 942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- Operand, which can be a reg or a u16/s16. --------- */ 947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 948663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSRH *MIPSRH_Imm(Bool syned, UShort imm16) 949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *op = LibVEX_Alloc(sizeof(MIPSRH)); 951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->tag = Mrh_Imm; 952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->Mrh.Imm.syned = syned; 953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->Mrh.Imm.imm16 = imm16; 954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* If this is a signed value, ensure it's not -32768, so that we 955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng are guaranteed always to be able to negate if needed. */ 956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) 957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(imm16 != 0x8000); 958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(syned == True || syned == False); 959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return op; 960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 962663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSRH *MIPSRH_Reg(HReg reg) 963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *op = LibVEX_Alloc(sizeof(MIPSRH)); 965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->tag = Mrh_Reg; 966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->Mrh.Reg.reg = reg; 967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return op; 968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid ppMIPSRH(MIPSRH * op, Bool mode64) 971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRHTag tag = op->tag; 973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (tag) { 974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Imm: 975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (op->Mrh.Imm.syned) 976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%d", (Int) (Short) op->Mrh.Imm.imm16); 977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%u", (UInt) (UShort) op->Mrh.Imm.imm16); 979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Reg: 981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(op->Mrh.Reg.reg, mode64); 982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("ppMIPSRH"); 985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* An MIPSRH can only be used in a "read" context (what would it mean 990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng to write or modify a literal?) and so we enumerate its registers 991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng accordingly. */ 992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void addRegUsage_MIPSRH(HRegUsage * u, MIPSRH * op) 993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op->tag) { 995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Imm: 996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Reg: 998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, op->Mrh.Reg.reg); 999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("addRegUsage_MIPSRH"); 1002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void mapRegs_MIPSRH(HRegRemap * m, MIPSRH * op) 1007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op->tag) { 1009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Imm: 1010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Reg: 1012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->Mrh.Reg.reg = lookupHRegRemap(m, op->Mrh.Reg.reg); 1013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("mapRegs_MIPSRH"); 1016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- Instructions. --------- */ 1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1022663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHChar *showMIPSUnaryOp(MIPSUnaryOp op) 1023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HChar* ret; 1025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 1026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mun_CLO: 1027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "clo"; 1028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mun_CLZ: 1030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "clz"; 1031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mun_NOP: 1033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "nop"; 1034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSUnaryOp"); 1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHChar *showMIPSAluOp(MIPSAluOp op, Bool immR) 1043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HChar* ret; 1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_ADD: 1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? "addiu" : "addu"; 1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_SUB: 1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "subu"; 1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_AND: 1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? "andi" : "and"; 1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_OR: 1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? "ori" : "or"; 1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_NOR: 1059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(immR == False); /*there's no nor with an immediate operand!? */ 1060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "nor"; 1061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_XOR: 1063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? "xori" : "xor"; 1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSAluOp"); 1067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1072663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHChar *showMIPSShftOp(MIPSShftOp op, Bool immR, Bool sz32) 1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HChar *ret; 1075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 1076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SRA: 1077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? (sz32 ? "sar" : "dsar") : (sz32 ? "sarv" : "dsrav"); 1078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SLL: 1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? (sz32 ? "sll" : "dsll") : (sz32 ? "sllv" : "dsllv"); 1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SRL: 1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? (sz32 ? "srl" : "dsrl") : (sz32 ? "srlv" : "dsrlv"); 1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSShftOp"); 1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHChar *showMIPSMaccOp(MIPSMaccOp op, Bool variable) 1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HChar *ret; 1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_ADD: 1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = variable ? "madd" : "maddu"; 1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_SUB: 1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = variable ? "msub" : "msubu"; 1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSAccOp"); 1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_LI(HReg dst, ULong imm) 1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_LI; 1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LI.dst = dst; 1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LI.imm = imm; 1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Alu(MIPSAluOp op, HReg dst, HReg srcL, MIPSRH * srcR) 1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Alu; 1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Alu.op = op; 1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Alu.dst = dst; 1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Alu.srcL = srcL; 1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Alu.srcR = srcR; 1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Shft(MIPSShftOp op, Bool sz32, HReg dst, HReg srcL, 1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH * srcR) 1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Shft; 1134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.op = op; 1135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.sz32 = sz32; 1136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.dst = dst; 1137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.srcL = srcL; 1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.srcR = srcR; 1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Unary(MIPSUnaryOp op, HReg dst, HReg src) 1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Unary; 1146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Unary.op = op; 1147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Unary.dst = dst; 1148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Unary.src = src; 1149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Cmp(Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR, 1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond) 1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Cmp; 1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.syned = syned; 1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.sz32 = sz32; 1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.dst = dst; 1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.srcL = srcL; 1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.srcR = srcR; 1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.cond = cond; 1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* multiply */ 1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mul(Bool syned, Bool wid, Bool sz32, HReg dst, HReg srcL, 1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR) 1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mul; 1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.syned = syned; 1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.widening = wid; /* widen=True else False */ 1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.sz32 = sz32; /* True = 32 bits */ 1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.dst = dst; 1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.srcL = srcL; 1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.srcR = srcR; 1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* msub */ 1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Msub(Bool syned, HReg srcL, HReg srcR) 1183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Macc; 1186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.op = Macc_SUB; 1188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.syned = syned; 1189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.srcL = srcL; 1190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.srcR = srcR; 1191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* madd */ 1195663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Madd(Bool syned, HReg srcL, HReg srcR) 1196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Macc; 1199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.op = Macc_ADD; 1201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.syned = syned; 1202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.srcL = srcL; 1203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.srcR = srcR; 1204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* div */ 1208663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Div(Bool syned, Bool sz32, HReg srcL, HReg srcR) 1209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Div; 1212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Div.syned = syned; 1213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Div.sz32 = sz32; /* True = 32 bits */ 1214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Div.srcL = srcL; 1215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Div.srcR = srcR; 1216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1219663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Call(MIPSCondCode cond, Addr32 target, UInt argiregs, 1220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg src) 1221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt mask; 1223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Call; 1225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.cond = cond; 1226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.target = target; 1227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.argiregs = argiregs; 1228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.src = src; 1229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Only r4 .. r7 inclusive may be used as arg regs. Hence: */ 1230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mask = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7); 1231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (argiregs & ~mask)); 1232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1235663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_CallAlways(MIPSCondCode cond, Addr32 target, UInt argiregs) 1236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt mask; 1238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Call; 1240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.cond = cond; 1241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.target = target; 1242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.argiregs = argiregs; 1243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Only r4 .. r7 inclusive may be used as arg regs. Hence: */ 1244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mask = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7); 1245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (argiregs & ~mask)); 1246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1249663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_XDirect ( Addr32 dstGA, MIPSAMode* amPC, 1250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond, Bool toFastEP ) { 1251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_XDirect; 1253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.dstGA = dstGA; 1254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.amPC = amPC; 1255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.cond = cond; 1256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.toFastEP = toFastEP; 1257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1260663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_XIndir ( HReg dstGA, MIPSAMode* amPC, 1261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond ) { 1262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_XIndir; 1264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.dstGA = dstGA; 1265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.amPC = amPC; 1266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.cond = cond; 1267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1270663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_XAssisted ( HReg dstGA, MIPSAMode* amPC, 1271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond, IRJumpKind jk ) { 1272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_XAssisted; 1274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XAssisted.dstGA = dstGA; 1275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XAssisted.amPC = amPC; 1276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XAssisted.cond = cond; 1277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XAssisted.jk = jk; 1278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1281663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Load(UChar sz, HReg dst, MIPSAMode * src, Bool mode64) 1282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Load; 1285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Load.sz = sz; 1286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Load.src = src; 1287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Load.dst = dst; 1288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8); 1289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 8) 1291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 1292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1295663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Store(UChar sz, MIPSAMode * dst, HReg src, Bool mode64) 1296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Store; 1299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Store.sz = sz; 1300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Store.src = src; 1301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Store.dst = dst; 1302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8); 1303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 8) 1305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 1306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1309663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_LoadL(UChar sz, HReg dst, MIPSAMode * src, Bool mode64) 1310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_LoadL; 1313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LoadL.sz = sz; 1314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LoadL.src = src; 1315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LoadL.dst = dst; 1316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 4 || sz == 8); 1317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 8) 1319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 1320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1323663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_StoreC(UChar sz, MIPSAMode * dst, HReg src, Bool mode64) 1324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_StoreC; 1327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.StoreC.sz = sz; 1328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.StoreC.src = src; 1329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.StoreC.dst = dst; 1330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 4 || sz == 8); 1331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 8) 1333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 1334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1337663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mthi(HReg src) 1338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mthi; 1341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MtHL.src = src; 1342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1345663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mtlo(HReg src) 1346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mtlo; 1349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MtHL.src = src; 1350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1353663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mfhi(HReg dst) 1354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mfhi; 1357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MfHL.dst = dst; 1358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1361663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mflo(HReg dst) 1362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mflo; 1365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MfHL.dst = dst; 1366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Read/Write Link Register */ 1370663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_RdWrLR(Bool wrLR, HReg gpr) 1371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_RdWrLR; 1374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.RdWrLR.wrLR = wrLR; 1375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.RdWrLR.gpr = gpr; 1376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1379663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_FpLdSt(Bool isLoad, UChar sz, HReg reg, MIPSAMode * addr) 1380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpLdSt; 1383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.isLoad = isLoad; 1384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.sz = sz; 1385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.reg = reg; 1386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.addr = addr; 1387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 4 || sz == 8); 1388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1391663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_FpUnary(MIPSFpOp op, HReg dst, HReg src) 1392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpUnary; 1395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpUnary.op = op; 1396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpUnary.dst = dst; 1397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpUnary.src = src; 1398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1401663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_FpBinary(MIPSFpOp op, HReg dst, HReg srcL, HReg srcR) 1402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpBinary; 1405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpBinary.op = op; 1406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpBinary.dst = dst; 1407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpBinary.srcL = srcL; 1408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpBinary.srcR = srcR; 1409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1412663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_FpConvert(MIPSFpOp op, HReg dst, HReg src) 1413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpConvert; 1416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpConvert.op = op; 1417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpConvert.dst = dst; 1418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpConvert.src = src; 1419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1423663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_FpCompare(MIPSFpOp op, HReg dst, HReg srcL, HReg srcR, 1424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar cond1) 1425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpCompare; 1428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpCompare.op = op; 1429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpCompare.dst = dst; 1430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpCompare.srcL = srcL; 1431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpCompare.srcR = srcR; 1432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpCompare.cond1 = cond1; 1433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1436663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_MovCond(HReg dst, HReg argL, MIPSRH * argR, HReg condR, 1437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond) 1438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_MovCond; 1441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MovCond.dst = dst; 1442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MovCond.srcL = argL; 1443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MovCond.srcR = argR; 1444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MovCond.condR = condR; 1445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MovCond.cond = cond; 1446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1449663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_MtFCSR(HReg src) 1450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_MtFCSR; 1453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MtFCSR.src = src; 1454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1457663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_MfFCSR(HReg dst) 1458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_MfFCSR; 1461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MfFCSR.dst = dst; 1462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1465663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_EvCheck ( MIPSAMode* amCounter, 1466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode* amFailAddr ) { 1467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_EvCheck; 1469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amCounter = amCounter; 1470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amFailAddr = amFailAddr; 1471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1474663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr* MIPSInstr_ProfInc ( void ) { 1475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_ProfInc; 1477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------- Pretty Print instructions ------------- */ 1481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void ppLoadImm(HReg dst, ULong imm, Bool mode64) 1482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("li "); 1484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(dst, mode64); 1485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(",0x%016llx", imm); 1486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid ppMIPSInstr(MIPSInstr * i, Bool mode64) 1489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->tag) { 1491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LI: 1492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppLoadImm(i->Min.LI.dst, i->Min.LI.imm, mode64); 1493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Alu: { 1495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg r_srcL = i->Min.Alu.srcL; 1496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *rh_srcR = i->Min.Alu.srcR; 1497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* generic */ 1498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSAluOp(i->Min.Alu.op, 1499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng toBool(rh_srcR->tag == Mrh_Imm))); 1500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Alu.dst, mode64); 1501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(r_srcL, mode64); 1503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSRH(rh_srcR, mode64); 1505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Shft: { 1508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg r_srcL = i->Min.Shft.srcL; 1509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *rh_srcR = i->Min.Shft.srcR; 1510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSShftOp(i->Min.Shft.op, 1511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng toBool(rh_srcR->tag == Mrh_Imm), 1512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.sz32)); 1513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Shft.dst, mode64); 1514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(r_srcL, mode64); 1516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSRH(rh_srcR, mode64); 1518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Unary: { 1521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSUnaryOp(i->Min.Unary.op)); 1522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Unary.dst, mode64); 1523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Unary.src, mode64); 1525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Cmp: { 1528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("word_compare "); 1529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Cmp.dst, mode64); 1530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(" = %s ( ", showMIPSCondCode(i->Min.Cmp.cond)); 1531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Cmp.srcL, mode64); 1532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Cmp.srcR, mode64); 1534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(" )"); 1535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mul: { 1539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Mul.widening) { 1540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case False: 1541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mul "); 1542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.dst, mode64); 1543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.srcL, mode64); 1545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.srcR, mode64); 1547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case True: 1549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s%s ", i->Min.Mul.sz32 ? "mult" : "dmult", 1550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.syned ? "" : "u"); 1551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.dst, mode64); 1552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.srcL, mode64); 1554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.srcR, mode64); 1556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mthi: { 1561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mthi "); 1562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MtHL.src, mode64); 1563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mtlo: { 1566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mtlo "); 1567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MtHL.src, mode64); 1568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mfhi: { 1571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mfhi "); 1572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MfHL.dst, mode64); 1573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mflo: { 1576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mflo "); 1577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MfHL.dst, mode64); 1578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Macc: { 1581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSMaccOp(i->Min.Macc.op, i->Min.Macc.syned)); 1582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Macc.srcL, mode64); 1583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Macc.srcR, mode64); 1585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Div: { 1588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!i->Min.Div.sz32) 1589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("d"); 1590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("div"); 1591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", i->Min.Div.syned ? "s" : "u"); 1592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Div.srcL, mode64); 1593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Div.srcR, mode64); 1595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Call: { 1598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int n; 1599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("call: "); 1600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Call.cond != MIPScc_AL) { 1601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (%s) ", showMIPSCondCode(i->Min.Call.cond)); 1602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("{ "); 1604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppLoadImm(hregMIPS_GPR11(mode64), i->Min.Call.target, mode64); 1605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(" ; mtctr r10 ; bctrl ["); 1607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (n = 0; n < 32; n++) { 1608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Call.argiregs & (1 << n)) { 1609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("r%d", n); 1610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if ((i->Min.Call.argiregs >> n) > 1) 1611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("] }"); 1615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XDirect: 1618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xDirect) "); 1619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (guest_COND.%s) { ", 1620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showMIPSCondCode(i->Min.XDirect.cond)); 1621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("move $9, 0x%x,", i->Min.XDirect.dstGA); 1622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; sw $9, "); 1623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.XDirect.amPC, mode64); 1624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; move $9, $disp_cp_chain_me_to_%sEP; jalr $9; nop}", 1625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.toFastEP ? "fast" : "slow"); 1626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XIndir: 1628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xIndir) "); 1629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (guest_COND.%s) { sw ", 1630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showMIPSCondCode(i->Min.XIndir.cond)); 1631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.XIndir.dstGA, mode64); 1632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.XIndir.amPC, mode64); 1634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; move $9, $disp_indir; jalr $9; nop}"); 1635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XAssisted: 1637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xAssisted) "); 1638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (guest_COND.%s) { ", 1639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showMIPSCondCode(i->Min.XAssisted.cond)); 1640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("sw "); 1641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.XAssisted.dstGA, mode64); 1642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.XAssisted.amPC, mode64); 1644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; move $9, $IRJumpKind_to_TRCVAL(%d)", 1645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (Int)i->Min.XAssisted.jk); 1646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; move $9, $disp_assisted; jalr $9; nop; }"); 1647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Load: { 1649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool idxd = toBool(i->Min.Load.src->tag == Mam_RR); 1650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar sz = i->Min.Load.sz; 1651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar c_sz = sz == 1 ? 'b' : sz == 2 ? 'h' : sz == 4 ? 'w' : 'd'; 1652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("l%c%s ", c_sz, idxd ? "x" : ""); 1653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Load.dst, mode64); 1654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.Load.src, mode64); 1656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Store: { 1659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar sz = i->Min.Store.sz; 1660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool idxd = toBool(i->Min.Store.dst->tag == Mam_RR); 1661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar c_sz = sz == 1 ? 'b' : sz == 2 ? 'h' : sz == 4 ? 'w' : 'd'; 1662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("s%c%s ", c_sz, idxd ? "x" : ""); 1663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Store.src, mode64); 1664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.Store.dst, mode64); 1666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LoadL: { 1669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ll "); 1670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.LoadL.dst, mode64); 1671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.LoadL.src, mode64); 1673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_StoreC: { 1676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("sc "); 1677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.StoreC.src, mode64); 1678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.StoreC.dst, mode64); 1680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_RdWrLR: { 1683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", i->Min.RdWrLR.wrLR ? "mtlr" : "mflr"); 1684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.RdWrLR.gpr, mode64); 1685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpUnary: 1688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSFpOp(i->Min.FpUnary.op)); 1689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpUnary.dst, mode64); 1690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpUnary.src, mode64); 1692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpBinary: 1694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s", showMIPSFpOp(i->Min.FpBinary.op)); 1695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpBinary.dst, mode64); 1696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpBinary.srcL, mode64); 1698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpBinary.srcR, mode64); 1700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpConvert: 1702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s", showMIPSFpOp(i->Min.FpConvert.op)); 1703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpConvert.dst, mode64); 1704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpConvert.src, mode64); 1706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpCompare: 1708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSFpOp(i->Min.FpCompare.op)); 1709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpCompare.srcL, mode64); 1710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpCompare.srcR, mode64); 1712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(" cond: %c", i->Min.FpCompare.cond1); 1713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpMulAcc: 1715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSFpOp(i->Min.FpMulAcc.op)); 1716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpMulAcc.dst, mode64); 1717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpMulAcc.srcML, mode64); 1719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpMulAcc.srcMR, mode64); 1721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpMulAcc.srcAcc, mode64); 1723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpLdSt: { 1725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.sz == 4) { 1726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.isLoad) { 1727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("lwc1 "); 1728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpLdSt.reg, mode64); 1729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.FpLdSt.addr, mode64); 1731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("swc1 "); 1733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpLdSt.reg, mode64); 1734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.FpLdSt.addr, mode64); 1736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (i->Min.FpLdSt.sz == 8) { 1738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.isLoad) { 1739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) 1740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ldc1 "); 1741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("lwc1 "); 1743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpLdSt.reg, mode64); 1744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.FpLdSt.addr, mode64); 1746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) 1748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("sdc1 "); 1749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("swc1 "); 1751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpLdSt.reg, mode64); 1752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.FpLdSt.addr, mode64); 1754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MovCond: { 1759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.MovCond.cond == MIPScc_MI) { 1760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("\ncond move\n"); 1761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MtFCSR: { 1767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ctc1 "); 1768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MtFCSR.src, mode64); 1769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", $31"); 1770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MfFCSR: { 1774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ctc1 "); 1775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MfFCSR.dst, mode64); 1776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", $31"); 1777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_EvCheck: 1780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(evCheck) lw $9, "); 1781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.EvCheck.amCounter, mode64); 1782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; addiu $9, $9, -1"); 1783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; sw $9, "); 1784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.EvCheck.amCounter, mode64); 1785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; bgez $t9, nofail; jalr *"); 1786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.EvCheck.amFailAddr, mode64); 1787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; nofail:"); 1788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_ProfInc: 1790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(profInc) move $9, ($NotKnownYet); " 1791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "lw $8, 0($9); " 1792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "addiu $8, $8, 1; " 1793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "sw $8, 0($9); " 1794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "sltiu $1, $8, 1; " 1795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "lw $8, 4($9); " 1796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "addu $8, $8, $1; " 1797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "sw $8, 4($9); " ); 1798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("ppMIPSInstr"); 1801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- Helpers for register allocation. --------- */ 1806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid getRegUsage_MIPSInstr(HRegUsage * u, MIPSInstr * i, Bool mode64) 1808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng initHRegUsage(u); 1810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->tag) { 1811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LI: 1812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.LI.dst); 1813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Alu: 1815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Alu.srcL); 1816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSRH(u, i->Min.Alu.srcR); 1817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Alu.dst); 1818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Shft: 1820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Shft.srcL); 1821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSRH(u, i->Min.Shft.srcR); 1822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Shft.dst); 1823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Cmp: 1825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Cmp.srcL); 1826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Cmp.srcR); 1827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Cmp.dst); 1828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Unary: 1830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Unary.src); 1831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Unary.dst); 1832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mul: 1834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Mul.dst); 1835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Mul.srcL); 1836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Mul.srcR); 1837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mthi: 1839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mtlo: 1840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_HI(mode64)); 1841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_LO(mode64)); 1842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.MtHL.src); 1843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mfhi: 1845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mflo: 1846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, hregMIPS_HI(mode64)); 1847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, hregMIPS_LO(mode64)); 1848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.MfHL.dst); 1849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MtFCSR: 1851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.MtFCSR.src); 1852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MfFCSR: 1854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.MfFCSR.dst); 1855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Macc: 1857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmModify, hregMIPS_HI(mode64)); 1858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmModify, hregMIPS_LO(mode64)); 1859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Macc.srcL); 1860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Macc.srcR); 1861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Div: 1863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_HI(mode64)); 1864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_LO(mode64)); 1865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Div.srcL); 1866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Div.srcR); 1867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Call: { 1869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Call.cond != MIPScc_AL) 1870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Call.src); 1871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt argir; 1872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR1(mode64)); 1873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR2(mode64)); 1875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR3(mode64)); 1876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR4(mode64)); 1878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR5(mode64)); 1879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR6(mode64)); 1880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR7(mode64)); 1881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR8(mode64)); 1883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR9(mode64)); 1884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR10(mode64)); 1885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR11(mode64)); 1886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR12(mode64)); 1887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR13(mode64)); 1888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR14(mode64)); 1889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR15(mode64)); 1890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR24(mode64)); 1892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR25(mode64)); 1893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR26(mode64)); 1894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR27(mode64)); 1895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Now we have to state any parameter-carrying registers 1897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng which might be read. This depends on the argiregs field. */ 1898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng argir = i->Min.Call.argiregs; 1899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (argir & (1 << 7)) 1900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, hregMIPS_GPR7(mode64)); 1901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (argir & (1 << 6)) 1902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, hregMIPS_GPR6(mode64)); 1903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (argir & (1 << 5)) 1904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, hregMIPS_GPR5(mode64)); 1905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (argir & (1 << 4)) 1906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, hregMIPS_GPR4(mode64)); 1907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (argir & ~((1 << 4) | (1 << 5) | (1 << 6) | (1 << 7)))); 1909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* XDirect/XIndir/XAssisted are also a bit subtle. They 1912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng conditionally exit the block. Hence we only need to list (1) 1913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng the registers that they read, and (2) the registers that they 1914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng write in the case where the block is not exited. (2) is 1915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng empty, hence only (1) is relevant here. */ 1916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XDirect: 1917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.XDirect.amPC); 1918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XIndir: 1920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.XIndir.dstGA); 1921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.XIndir.amPC); 1922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XAssisted: 1924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.XAssisted.dstGA); 1925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.XAssisted.amPC); 1926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Load: 1928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.Load.src); 1929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Load.dst); 1930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Store: 1932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Store.src); 1933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.Store.dst); 1934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LoadL: 1936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.LoadL.src); 1937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.LoadL.dst); 1938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_StoreC: 1940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.StoreC.src); 1941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.StoreC.src); 1942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.StoreC.dst); 1943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_RdWrLR: 1945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, (i->Min.RdWrLR.wrLR ? HRmRead : HRmWrite), 1946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.RdWrLR.gpr); 1947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpLdSt: 1949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.sz == 4) { 1950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, (i->Min.FpLdSt.isLoad ? HRmWrite : HRmRead), 1951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.reg); 1952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.FpLdSt.addr); 1953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (i->Min.FpLdSt.sz == 8) { 1955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 1956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, (i->Min.FpLdSt.isLoad ? HRmWrite : HRmRead), 1957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.reg); 1958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.FpLdSt.addr); 1959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, (i->Min.FpLdSt.isLoad ? HRmWrite : HRmRead), 1961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.reg); 1962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.FpLdSt.addr); 1963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, nextMIPSAModeFloat(i->Min.FpLdSt.addr)); 1964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpUnary: 1969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpUnary.op == Mfp_CVTD) { 1970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.FpUnary.dst); 1971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpUnary.src); 1972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.FpUnary.dst); 1975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpUnary.src); 1976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpBinary: 1979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.FpBinary.dst); 1980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpBinary.srcL); 1981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpBinary.srcR); 1982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpConvert: 1984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.FpConvert.dst); 1985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpConvert.src); 1986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpCompare: 1988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.FpCompare.dst); 1989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpCompare.srcL); 1990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpCompare.srcR); 1991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MovCond: 1993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.MovCond.srcR->tag == Mrh_Reg) { 1994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.MovCond.srcR->Mrh.Reg.reg); 1995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.MovCond.srcL); 1997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.MovCond.condR); 1998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.MovCond.dst); 1999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_EvCheck: 2001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We expect both amodes only to mention %ebp, so this is in 2002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fact pointless, since %ebp isn't allocatable, but anyway.. */ 2003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.EvCheck.amCounter); 2004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.EvCheck.amFailAddr); 2005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_ProfInc: 2007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* does not use any registers. */ 2008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSInstr(i, mode64); 2011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("getRegUsage_MIPSInstr"); 2012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* local helper */ 2017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void mapReg(HRegRemap * m, HReg * r) 2018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *r = lookupHRegRemap(m, *r); 2020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid mapRegs_MIPSInstr(HRegRemap * m, MIPSInstr * i, Bool mode64) 2023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->tag) { 2025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LI: 2026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.LI.dst); 2027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Alu: 2029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Alu.srcL); 2030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSRH(m, i->Min.Alu.srcR); 2031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Alu.dst); 2032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Shft: 2034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Shft.srcL); 2035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSRH(m, i->Min.Shft.srcR); 2036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Shft.dst); 2037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Cmp: 2039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Cmp.srcL); 2040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Cmp.srcR); 2041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Cmp.dst); 2042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Unary: 2044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Unary.src); 2045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Unary.dst); 2046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mul: 2048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Mul.dst); 2049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Mul.srcL); 2050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Mul.srcR); 2051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mthi: 2053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mtlo: 2054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MtHL.src); 2055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mfhi: 2057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mflo: 2058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MfHL.dst); 2059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Macc: 2061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Macc.srcL); 2062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Macc.srcR); 2063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Div: 2065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Div.srcL); 2066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Div.srcR); 2067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Call: 2069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 2070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Call.cond != MIPScc_AL) 2071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Call.src); 2072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XDirect: 2075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.XDirect.amPC); 2076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XIndir: 2078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.XIndir.dstGA); 2079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.XIndir.amPC); 2080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XAssisted: 2082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.XAssisted.dstGA); 2083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.XAssisted.amPC); 2084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Load: 2086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.Load.src); 2087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Load.dst); 2088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Store: 2090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Store.src); 2091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.Store.dst); 2092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LoadL: 2094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.LoadL.src); 2095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.LoadL.dst); 2096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_StoreC: 2098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.StoreC.src); 2099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.StoreC.dst); 2100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_RdWrLR: 2102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.RdWrLR.gpr); 2103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpLdSt: 2105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.sz == 4) { 2106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpLdSt.reg); 2107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.FpLdSt.addr); 2108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (i->Min.FpLdSt.sz == 8) { 2110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 2111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpLdSt.reg); 2112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.FpLdSt.addr); 2113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpLdSt.reg); 2115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.FpLdSt.addr); 2116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, nextMIPSAModeFloat(i->Min.FpLdSt.addr)); 2117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpUnary: 2122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpUnary.op == Mfp_CVTD) { 2123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpUnary.dst); 2124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpUnary.src); 2125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpUnary.dst); 2128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpUnary.src); 2129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpBinary: 2132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpBinary.dst); 2133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpBinary.srcL); 2134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpBinary.srcR); 2135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpConvert: 2137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpConvert.dst); 2138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpConvert.src); 2139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpCompare: 2141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpCompare.dst); 2142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpCompare.srcL); 2143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpCompare.srcR); 2144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MtFCSR: 2146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MtFCSR.src); 2147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MfFCSR: 2149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MfFCSR.dst); 2150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MovCond: 2152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.MovCond.srcR->tag == Mrh_Reg) { 2153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &(i->Min.MovCond.srcR->Mrh.Reg.reg)); 2154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MovCond.srcL); 2156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MovCond.condR); 2157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MovCond.dst); 2158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_EvCheck: 2161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We expect both amodes only to mention %ebp, so this is in 2162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fact pointless, since %ebp isn't allocatable, but anyway.. */ 2163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.EvCheck.amCounter); 2164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.EvCheck.amFailAddr); 2165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_ProfInc: 2167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* does not use any registers. */ 2168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSInstr(i, mode64); 2171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("mapRegs_MIPSInstr"); 2172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Figure out if i represents a reg-reg move, and if so assign the 2178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng source and destination to *src and *dst. If in doubt say No. Used 2179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng by the register allocator to do move coalescing. 2180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/ 2181663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengBool isMove_MIPSInstr(MIPSInstr * i, HReg * src, HReg * dst) 2182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Moves between integer regs */ 2184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->tag == Min_Alu) { 2185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // or Rd,Rs,Rs == mr Rd,Rs 2186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Alu.op != Malu_OR) 2187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return False; 2188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Alu.srcR->tag != Mrh_Reg) 2189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return False; 2190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Alu.srcR->Mrh.Reg.reg != i->Min.Alu.srcL) 2191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return False; 2192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *src = i->Min.Alu.srcL; 2193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *dst = i->Min.Alu.dst; 2194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return True; 2195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return False; 2197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate mips spill/reload instructions under the direction of the 2200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register allocator. 2201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/ 2202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid genSpill_MIPS( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2, HReg rreg, 2203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int offsetB, Bool mode64) 2204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am; 2206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(offsetB >= 0); 2207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(rreg)); 2208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = *i2 = NULL; 2209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am = MIPSAMode_IR(offsetB, GuestStatePointer(mode64)); 2210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (hregClass(rreg)) { 2212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcInt64: 2213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 2214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_Store(8, am, rreg, mode64); 2215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcInt32: 2217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!mode64); 2218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_Store(4, am, rreg, mode64); 2219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt32: 2221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!mode64); 2222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(False /*Store */ , 4, rreg, am); 2223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt64: 2225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(False /*Store */ , 8, rreg, am); 2226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegClass(hregClass(rreg)); 2229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("genSpill_MIPS: unimplemented regclass"); 2230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid genReload_MIPS( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2, HReg rreg, 2235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int offsetB, Bool mode64) 2236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am; 2238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(rreg)); 2239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am = MIPSAMode_IR(offsetB, GuestStatePointer(mode64)); 2240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (hregClass(rreg)) { 2242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcInt64: 2243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 2244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_Load(8, rreg, am, mode64); 2245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcInt32: 2247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!mode64); 2248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_Load(4, rreg, am, mode64); 2249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt32: 2251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) 2252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(True /*Load */ , 8, rreg, am); 2253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(True /*Load */ , 4, rreg, am); 2255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt64: 2257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(True /*Load */ , 8, rreg, am); 2258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegClass(hregClass(rreg)); 2261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("genReload_MIPS: unimplemented regclass"); 2262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- The mips assembler --------- */ 2267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt iregNo(HReg r, Bool mode64) 2269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n; 2271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(hregClass(r) == mode64 ? HRcInt64 : HRcInt32); 2272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(r)); 2273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng n = hregNumber(r); 2274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n <= 32); 2275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return n; 2276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar fregNo(HReg r, Bool mode64) 2279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n; 2281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(hregClass(r) == mode64 ? HRcFlt64 : HRcFlt32); 2282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(r)); 2283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng n = hregNumber(r); 2284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n <= 31); 2285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return n; 2286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar dregNo(HReg r) 2289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n; 2291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(hregClass(r) == HRcFlt64); 2292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(r)); 2293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng n = hregNumber(r); 2294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n <= 31); 2295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return n; 2296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Emit 32bit instruction */ 2299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *emit32(UChar * p, UInt w32) 2300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL) 2302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar(w32 & 0x000000FF); 2303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 8) & 0x000000FF); 2304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 16) & 0x000000FF); 2305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 24) & 0x000000FF); 2306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB) 2307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 24) & 0x000000FF); 2308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 16) & 0x000000FF); 2309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 8) & 0x000000FF); 2310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar(w32 & 0x000000FF); 2311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 2312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Fetch an instruction */ 2315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt fetch32 ( UChar* p ) 2316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt w32 = 0; 2318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL) 2319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[0]) << 0); 2320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[1]) << 8); 2321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[2]) << 16); 2322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[3]) << 24); 2323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB) 2324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[0]) << 24); 2325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[1]) << 16); 2326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[2]) << 8); 2327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[3]) << 0); 2328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 2329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return w32; 2330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* physical structure of mips instructions */ 2333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* type I : opcode - 6 bits 2334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rs - 5 bits 2335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rt - 5 bits 2336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng immediate - 16 bits 2337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/ 2338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkFormI(UChar * p, UInt opc, UInt rs, UInt rt, UInt imm) 2339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 2341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc < 0x40); 2342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rs < 0x20); 2343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rt < 0x20); 2344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = imm & 0xFFFF; 2345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc << 26) | (rs << 21) | (rt << 16) | (imm)); 2346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 2347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* type R: opcode - 6 bits 2350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rs - 5 bits 2351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rt - 5 bits 2352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rd - 5 bits 2353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sa - 5 bits 2354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng func - 6 bits 2355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/ 2356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkFormR(UChar * p, UInt opc, UInt rs, UInt rt, UInt rd, UInt sa, 2357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt func) 2358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rs >= 0x20) 2360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("rs = %d\n", rs); 2361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 2362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc < 0x40); 2363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rs < 0x20); 2364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rt < 0x20); 2365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rd < 0x20); 2366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sa < 0x20); 2367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng func = func & 0xFFFF; 2368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc << 26) | (rs << 21) | (rt << 16) | (rd << 11) | (sa << 6) | 2369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (func)); 2370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 2372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkFormS(UChar * p, UInt opc1, UInt rRD, UInt rRS, UInt rRT, 2375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt sa, UInt opc2) 2376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 2378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc1 <= 0x3F); 2379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rRD < 0x20); 2380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rRS < 0x20); 2381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rRT < 0x20); 2382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc2 <= 0x3F); 2383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sa >= 0 && sa <= 0x3F); 2384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc1 << 26) | (rRS << 21) | (rRT << 16) | (rRD << 11) | 2386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ((sa & 0x1F) << 6) | (opc2)); 2387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 2389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *doAMode_IR(UChar * p, UInt opc1, UInt rSD, MIPSAMode * am, 2392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64) 2393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt rA, idx, r_dst; 2395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(am->tag == Mam_IR); 2396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(am->Mam.IR.index < 0x10000); 2397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rA = iregNo(am->Mam.IR.base, mode64); 2399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng idx = am->Mam.IR.index; 2400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33 || rSD == 34) 2402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_dst = 24; 2403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_dst = rSD; 2405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (opc1 < 40) { 2407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //load 2408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33) 2409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mfhi */ 2410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 16); 2411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (rSD == 34) 2412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mflo */ 2413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 18); 2414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, opc1, rA, r_dst, idx); 2417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (opc1 >= 40) { 2419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //store 2420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33) 2421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mthi */ 2422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_dst, 0, 0, 0, 17); 2423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (rSD == 34) 2424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtlo */ 2425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_dst, 0, 0, 0, 19); 2426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *doAMode_RR(UChar * p, UInt opc1, UInt rSD, MIPSAMode * am, 2432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64) 2433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt rA, rB, r_dst; 2435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(am->tag == Mam_RR); 2436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rA = iregNo(am->Mam.RR.base, mode64); 2438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rB = iregNo(am->Mam.RR.index, mode64); 2439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33 || rSD == 34) 2441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_dst = 24; 2442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_dst = rSD; 2444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (opc1 < 40) { 2446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //load 2447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33) 2448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mfhi */ 2449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 16); 2450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (rSD == 34) 2451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mflo */ 2452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 18); 2453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addiu sp, sp, -4 2455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * sw rA, 0(sp) 2456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * addu rA, rA, rB 2457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * sw/lw r_dst, 0(rA) 2458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * lw rA, 0(sp) 2459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * addiu sp, sp, 4 */ 2460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 2461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 25, 29, 29, 0xFFFC); 2462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 63, 29, rA, 0); 2463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, rA, rB, rA, 0, 45); 2464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, opc1, rA, r_dst, 0); 2465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 55, 29, rA, 0); 2466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 25, 29, 29, 4); 2467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 29, 29, 0xFFFC); 2469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 43, 29, rA, 0); 2470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, rA, rB, rA, 0, 33); 2471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, opc1, rA, r_dst, 0); 2472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 35, 29, rA, 0); 2473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 29, 29, 4); 2474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (opc1 >= 40) { 2476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //store 2477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33) 2478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mthi */ 2479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_dst, 0, 0, 0, 17); 2480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (rSD == 34) 2481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtlo */ 2482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_dst, 0, 0, 0, 19); 2483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Load imm to r_dst */ 2489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkLoadImm(UChar * p, UInt r_dst, ULong imm, Bool mode64) 2490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 2493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt) imm; 2494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int) u32; 2495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long) s32; 2496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong) s64; 2497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (imm >= 0xFFFFFFFFFFFF8000ULL || imm < 0x8000) { 2500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // sign-extendable from 16 bits 2501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // addiu r_dst,0,imm => li r_dst,imm 2502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 0, r_dst, imm & 0xFFFF); 2503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (imm >= 0xFFFFFFFF80000000ULL || imm < 0x80000000ULL) { 2505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // sign-extendable from 32 bits 2506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // addiu r_dst,r0,(imm>>16) => lis r_dst, (imm>>16) 2507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lui r_dst, (imm>>16) 2508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 15, 0, r_dst, (imm >> 16) & 0xFFFF); 2509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm & 0xFFFF) 2510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 2513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lui load in upper half of low word 2514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 15, 0, r_dst, (imm >> 48) & 0xFFFF); 2515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori 2516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, (imm >> 32) & 0xFFFF); 2517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //shift 2518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_dst, 16, 56); 2519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori 2520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, (imm >> 16) & 0xFFFF); 2521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //shift 2522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_dst, 16, 56); 2523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori 2524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A simplified version of mkLoadImm that always generates 2 or 5 2531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instructions (32 or 64 bits respectively) even if it could generate 2532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fewer. This is needed for generating fixed sized patchable 2533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sequences. */ 2534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* mkLoadImm_EXACTLY2or5 ( UChar* p, 2535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst, ULong imm, Bool mode64 ) 2536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 2538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* In 32-bit mode, make sure the top 32 bits of imm are a sign 2541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng extension of the bottom 32 bits. (Probably unnecessary.) */ 2542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt)imm; 2543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int)u32; 2544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long)s32; 2545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong)s64; 2546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // sign-extendable from 32 bits 2550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // addiu r_dst,r0,(imm>>16) => lis r_dst, (imm>>16) 2551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lui r_dst, (imm>>16) 2552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 15, 0, r_dst, (imm >> 16) & 0xFFFF); 2553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm & 0xFFFF) 2554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Checks whether the sequence of bytes at p was indeed created 2562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng by mkLoadImm_EXACTLY2or5 with the given parameters. */ 2563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool isLoadImm_EXACTLY2or5 ( UChar* p_to_check, 2564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst, ULong imm, Bool mode64 ) 2565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 2567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool ret; 2568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* In 32-bit mode, make sure the top 32 bits of imm are a sign 2570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng extension of the bottom 32 bits. (Probably unnecessary.) */ 2571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt)imm; 2572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int)u32; 2573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long)s32; 2574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong)s64; 2575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt expect[2] = { 0, 0 }; 2579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)&expect[0]; 2580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lui r_dst, (imm>>16) 2581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 15, 0, r_dst, (imm >> 16) & 0xFFFF); 2582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ori r_dst, r_dst, (imm & 0xFFFF) 2583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(p == (UChar*)&expect[2]); 2585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = fetch32(p_to_check + 0) == expect[0] 2587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng && fetch32(p_to_check + 4) == expect[1]; 2588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 2593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a machine-word sized load or store. Simplified version of 2596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng the Min_Load and Min_Store cases below. */ 2597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar* do_load_or_store_machine_word ( 2598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p, Bool isLoad, 2599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt reg, MIPSAMode* am, Bool mode64 ) 2600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (isLoad) { /* load */ 2602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1, sz = mode64 ? 8 : 4; 2603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 2604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 2605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 2606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Mam.IR.index & 3)); 2607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 2609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 2610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 32; 2611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 2613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 33; 2614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 2616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 35; 2617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 2619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 55; 2620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 2621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 2627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 2629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 2630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 2631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else /* store */ { 2638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc1, sz = mode64 ? 8 : 4; 2639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 2640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 2641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 2642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Mam.IR.index & 3)); 2643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 2645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 2646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 40; 2647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 2649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 41; 2650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 2652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 43; 2653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 2655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 2656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc1 = 63; 2657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc1, reg, am, mode64); 2663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 2665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 2666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 2667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Move r_dst to r_src */ 2678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkMoveReg(UChar * p, UInt r_dst, UInt r_src) 2679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 2681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_src < 0x20); 2682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (r_dst != r_src) { 2684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* or r_dst, r_src, r_src */ 2685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_src, r_src, r_dst, 0, 37); 2686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Emit an instruction into buf and return the number of bytes used. 2691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Note that buf is not the insn's final place, and therefore it is 2692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imperative to emit position-independent code. If the emitted 2693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instruction was a profiler inc, set *is_profInc to True, else 2694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng leave it unchanged. */ 2695663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt emit_MIPSInstr ( /*MB_MOD*/Bool* is_profInc, 2696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* buf, Int nbuf, MIPSInstr* i, 2697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64, 2698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_slowEP, 2699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_fastEP, 2700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xindir, 2701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xassisted ) 2702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar *p = &buf[0]; 2704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar *ptmp = p; 2705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(nbuf >= 32); 2706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->tag) { 2708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MovCond: { 2709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *srcR = i->Min.MovCond.srcR; 2710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt condR = iregNo(i->Min.MovCond.condR, mode64); 2711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt dst = iregNo(i->Min.MovCond.dst, mode64); 2712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt srcL = iregNo(i->Min.MovCond.srcL, mode64); 2714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkMoveReg(p, dst, srcL); 2716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.MovCond.cond == MIPScc_MI) { 2717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 7, condR, 0, 2); //bgtz cond,2 2718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); //nop 2721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (srcR->tag == Mrh_Reg) { 2723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //or dst,src,src 2724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkMoveReg(p, dst, iregNo(srcR->Mrh.Reg.reg, mode64)); 2725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /*p = mkFormR(p, 0, dst, iregNo(src->Mrh.Reg.reg, mode64), 2726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng iregNo(src->Mrh.Reg.reg, mode64), 0, 37);*/ 2727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, dst, srcR->Mrh.Imm.imm16, mode64); 2729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 2732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LI: 2734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, iregNo(i->Min.LI.dst, mode64), i->Min.LI.imm, mode64); 2735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 2736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Alu: { 2738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *srcR = i->Min.Alu.srcR; 2739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool immR = toBool(srcR->tag == Mrh_Imm); 2740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Alu.dst, mode64); 2741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Alu.srcL, mode64); 2742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = immR ? (-1) /*bogus */ : iregNo(srcR->Mrh.Reg.reg, mode64); 2743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Alu.op) { 2745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /*Malu_ADD, Malu_SUB, Malu_AND, Malu_OR, Malu_NOR, Malu_XOR */ 2746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_ADD: 2747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(srcR->Mrh.Imm.imm16 != 0x8000); 2749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (srcR->Mrh.Imm.syned) 2750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addi */ 2751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addiu */ 2754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addu */ 2757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 33); 2758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_SUB: 2761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addi , but with negated imm */ 2763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(srcR->Mrh.Imm.syned); 2764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(srcR->Mrh.Imm.imm16 != 0x8000); 2765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 8, r_srcL, r_dst, (-srcR->Mrh.Imm.imm16)); 2766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* subu */ 2768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 35); 2769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_AND: 2772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* andi */ 2774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!srcR->Mrh.Imm.syned); 2775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 12, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* and */ 2778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 36); 2779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_OR: 2782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ori */ 2784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!srcR->Mrh.Imm.syned); 2785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* or */ 2788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (r_srcL == 33) 2789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //MFHI 2790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 16); 2791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (r_srcL == 34) 2792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //MFLO 2793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 18); 2794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (r_dst == 33) 2795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //MTHI 2796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, 0, 0, 0, 17); 2797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (r_dst == 34) 2798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //MTLO 2799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, 0, 0, 0, 19); 2800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 37); 2802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_NOR: 2805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nor */ 2806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!immR); 2807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 39); 2808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_XOR: 2810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* xori */ 2812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!srcR->Mrh.Imm.syned); 2813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 14, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* xor */ 2816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 38); 2817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 2822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 2824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Shft: { 2827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *srcR = i->Min.Shft.srcR; 2828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool sz32 = i->Min.Shft.sz32; 2829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool immR = toBool(srcR->tag == Mrh_Imm); 2830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Shft.dst, mode64); 2831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Shft.srcL, mode64); 2832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = immR ? (-1) /*bogus */ : iregNo(srcR->Mrh.Reg.reg, 2833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64); 2834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) 2835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz32); 2836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Shft.op) { 2837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SLL: 2838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 2839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 2841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n >= 0 && n < 32); 2842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 0); 2843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* shift variable */ 2845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 4); 2846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 2850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert((n >= 0 && n < 32) || (n > 31 && n < 64)); 2851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (n >= 0 && n < 32) { 2852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 56); 2853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n - 32, 60); 2855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 20); 2858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SRL: 2863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 2864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // SRL, SRLV 2865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 2867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n >= 0 && n < 32); 2868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 2); 2869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* shift variable */ 2871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 6); 2872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // DSRL, DSRL32, DSRLV 2875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 2877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert((n >= 0 && n < 32) || (n > 31 && n < 64)); 2878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (n >= 0 && n < 32) { 2879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 58); 2880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n - 32, 62); 2882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 22); 2885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SRA: 2890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 2891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // SRA, SRAV 2892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 2894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n >= 0 && n < 32); 2895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 3); 2896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* shift variable */ 2898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 7); 2899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // DSRA, DSRA32, DSRAV 2902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 2904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert((n >= 0 && n < 32) || (n > 31 && n < 64)); 2905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (n >= 0 && n < 32) { 2906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 59); 2907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n - 32, 63); 2909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 23); 2912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 2918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 2921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Unary: { 2924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Unary.dst, mode64); 2925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.Unary.src, mode64); 2926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Unary.op) { 2928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /*Mun_CLO, Mun_CLZ, Mun_NOP */ 2929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mun_CLO: //clo 2930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_src, 0 /*whatever */ , r_dst, 0, 33); 2931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mun_CLZ: //clz 2933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_src, 0 /*whatever */ , r_dst, 0, 32); 2934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mun_NOP: //nop (sll r0,r0,0) 2936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); 2937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 2940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Cmp: { 2943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Cmp.srcL, mode64); 2944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = iregNo(i->Min.Cmp.srcR, mode64); 2945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Cmp.dst, mode64); 2946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Cmp.cond) { 2948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_EQ: 2949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addiu r_dst, r0, 1 2950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng beq r_srcL, r_srcR, 2 2951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 2952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addiu r_dst, r0, 0 2953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 2954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 0, r_dst, 1); 2955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 4, r_srcL, r_srcR, 2); 2956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); 2957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 0, r_dst, 0); 2958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_NE: 2960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addiu r_dst, r0, 1 2961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bne r_srcL, r_srcR, 2 2962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 2963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addiu r_dst, r0, 0 2964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 2965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 0, r_dst, 1); 2966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 5, r_srcL, r_srcR, 2); 2967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); 2968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 0, r_dst, 0); 2969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LT: 2971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* slt r_dst, r_srcL, r_srcR */ 2972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 42); 2973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LO: 2975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* sltu r_dst, r_srcL, r_srcR */ 2976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 43); 2977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LE: 2979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addiu r_dst, r0, 1 2980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng beq r_srcL, r_srcR, 2 2981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 2982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng slt r_dst, r_srcL, r_srcR */ 2983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 0, r_dst, 1); 2984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 4, r_srcL, r_srcR, 2); 2985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); 2986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 42); 2987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LS: 2989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addiu r_dst, r0, 1 2990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng beq r_srcL, r_srcR, 2 2991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 2992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sltu r_dst, r_srcL, r_srcR */ 2993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 0, r_dst, 1); 2994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 4, r_srcL, r_srcR, 2); 2995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); 2996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 43); 2997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mul: { 3005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool syned = i->Min.Mul.syned; 3006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool widening = i->Min.Mul.widening; 3007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool sz32 = i->Min.Mul.sz32; 3008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Mul.srcL, mode64); 3009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = iregNo(i->Min.Mul.srcR, mode64); 3010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Mul.dst, mode64); 3011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (widening) { 3013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 3014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) 3015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mult */ 3016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 24); 3017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 3018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* multu */ 3019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 25); 3020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) /* DMULT r_dst,r_srcL,r_srcR */ 3022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 28); 3023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else /* DMULTU r_dst,r_srcL,r_srcR */ 3024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 29); 3025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) 3028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mul */ 3029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, r_dst, 0, 2); 3030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (mode64 && !sz32) 3031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, r_dst, 0, 2); 3032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 3033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Macc: { 3039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool syned = i->Min.Macc.syned; 3040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Macc.srcL, mode64); 3041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = iregNo(i->Min.Macc.srcR, mode64); 3042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) { 3044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Macc.op) { 3045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_ADD: 3046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //madd 3047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, 0, 0, 0); 3048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_SUB: 3050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //msub 3051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, 0, 0, 3052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4); 3053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Macc.op) { 3059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_ADD: 3060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //maddu 3061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, 0, 0, 3062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1); 3063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_SUB: 3065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //msubu 3066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, 0, 0, 3067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5); 3068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Div: { 3078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool syned = i->Min.Div.syned; 3079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool sz32 = i->Min.Div.sz32; 3080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Div.srcL, mode64); 3081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = iregNo(i->Min.Div.srcR, mode64); 3082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 3083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) { 3084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* div */ 3085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 26); 3086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else 3087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* divu */ 3088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 27); 3089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) { 3092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ddiv */ 3093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 30); 3094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else 3095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ddivu */ 3096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 31); 3097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mthi: { 3102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.MtHL.src, mode64); 3103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_src, 0, 0, 0, 17); 3104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mtlo: { 3108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.MtHL.src, mode64); 3109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_src, 0, 0, 0, 19); 3110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mfhi: { 3114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.MfHL.dst, mode64); 3115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 16); 3116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mflo: { 3120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.MfHL.dst, mode64); 3121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 18); 3122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MtFCSR: { 3126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.MtFCSR.src, mode64); 3127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ctc1 */ 3128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 17, 6, r_src, 31, 0, 0); 3129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MfFCSR: { 3133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.MfFCSR.dst, mode64); 3134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* cfc1 */ 3135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 17, 2, r_dst, 31, 0, 0); 3136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Call: { 3140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond = i->Min.Call.cond; 3141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = 25; /* using %r25 as address temporary - 3142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng see getRegUsage_MIPSInstr */ 3143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jump over the following insns if condition does not hold */ 3145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (cond != MIPScc_AL) { 3146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jmp fwds if !condition */ 3147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* don't know how many bytes to jump over yet... 3148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng make space for a jump instruction + nop!!! and fill in later. */ 3149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; /* fill in this bit later */ 3150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 8; // p += 8 3151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* load target to r_dst */// p += 4|8 3154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, r_dst, i->Min.Call.target, mode64); 3155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jalr %r_dst */ 3157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_dst, 0, 31, 0, 9); // p += 4 3158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); // p += 4 3159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 3161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (cond != MIPScc_AL) { 3162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.Call.src, mode64); 3163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 3164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta >= 20 && delta <= 32); 3166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bc !ct,cf,delta/4 */ 3167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* blez r_src, delta/4-1 */ 3168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(cond == MIPScc_EQ); 3169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 6, r_src, 0, delta / 4 - 1); 3170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormR(ptmp, 0, 0, 0, 0, 0, 0); 3171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XDirect: { 3176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* NB: what goes on here has to be very closely coordinated 3177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng with the chainXDirect_MIPS and unchainXDirect_MIPS below. */ 3178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We're generating chain-me requests here, so we need to be 3179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sure this is actually allowed -- no-redir translations 3180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng can't use chain-me's. Hence: */ 3181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_chain_me_to_slowEP != NULL); 3182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_chain_me_to_fastEP != NULL); 3183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Use ptmp for backpatching conditional jumps. */ 3185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = NULL; 3186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional 3188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jump over the rest of it. Or at least, leave a space for 3189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng it that we will shortly fill in. */ 3190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XDirect.cond != MIPScc_AL) { 3191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Min.XDirect.cond != MIPScc_NV); 3192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 3193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 12; 3194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest PC. */ 3197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* move r9, dstGA */ 3198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* sw r9, amPC */ 3199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/9, 3200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (ULong)i->Min.XDirect.dstGA, mode64); 3201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word(p, False/*!isLoad*/, 3202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /*r*/9, i->Min.XDirect.amPC, mode64); 3203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* --- FIRST PATCHABLE BYTE follows --- */ 3205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* VG_(disp_cp_chain_me_to_{slowEP,fastEP}) (where we're 3206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng calling to) backs up the return address, so as to find the 3207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng address of the first patchable byte. So: don't change the 3208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng number of instructions (3) below. */ 3209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* move r9, VG_(disp_cp_chain_me_to_{slowEP,fastEP}) */ 3210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jr r9 */ 3211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me 3212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng = i->Min.XDirect.toFastEP ? disp_cp_chain_me_to_fastEP 3213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : disp_cp_chain_me_to_slowEP; 3214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/9, 3215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(disp_cp_chain_me), mode64); 3216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jalr $9 */ 3217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nop */ 3218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 9, 0, 31, 0, 9); // p += 4 3219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); // p += 4 3220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* --- END of PATCHABLE BYTES --- */ 3221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 3223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XDirect.cond != MIPScc_AL) { 3224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 3225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng delta = delta / 4 - 3; 3226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta > 0 && delta < 40); 3227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lw $9, 316($10) // guest_COND 3228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng beq $9, $0, 2 3229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop*/ 3230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 35, 10, 9, 316); 3231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 4, 0, 9, (delta)); 3232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormR(ptmp, 0, 0, 0, 0, 0, 0); 3233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XIndir: { 3238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We're generating transfers that could lead indirectly to a 3239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng chain-me, so we need to be sure this is actually allowed -- 3240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng no-redir translations are not allowed to reach normal 3241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng translations without going through the scheduler. That means 3242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng no XDirects or XIndirs out from no-redir translations. 3243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Hence: */ 3244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_xindir != NULL); 3245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Use ptmp for backpatching conditional jumps. */ 3247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = NULL; 3248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional 3250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jump over the rest of it. */ 3251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XIndir.cond != MIPScc_AL) { 3252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Min.XIndir.cond != MIPScc_NV); 3253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 3254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 12; 3255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest PC. */ 3258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* sw r-dstGA, amPC */ 3259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word(p, False/*!isLoad*/, 3260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng iregNo(i->Min.XIndir.dstGA, mode64), 3261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.amPC, mode64); 3262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* move r9, VG_(disp_cp_xindir) */ 3264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jalr r9 */ 3265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nop */ 3266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5 ( p, /*r*/9, 3267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(disp_cp_xindir), mode64); 3268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 9, 0, 31, 0, 9); // p += 4 3269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); // p += 4 3270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 3272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XIndir.cond != MIPScc_AL) { 3273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 3274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng delta = delta / 4 - 3; 3275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta > 0 && delta < 40); 3276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lw $9, 316($10) // guest_COND 3277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng beq $9, $0, 2 3278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop*/ 3279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 35, 10, 9, 316); 3280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 4, 0, 9, (delta)); 3281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormR(ptmp, 0, 0, 0, 0, 0, 0); 3282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XAssisted: { 3287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional jump 3288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng over the rest of it. Or at least, leave a space for it that 3289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we will shortly fill in. */ 3290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = NULL; 3291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XAssisted.cond != MIPScc_AL) { 3292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Min.XAssisted.cond != MIPScc_NV); 3293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 3294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 12; 3295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest PC. */ 3298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* sw r-dstGA, amPC */ 3299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word(p, False/*!isLoad*/, 3300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng iregNo(i->Min.XIndir.dstGA, mode64), 3301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.amPC, mode64); 3302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r31, $magic_number */ 3304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt trcval = 0; 3305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.XAssisted.jk) { 3306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_ClientReq: trcval = VEX_TRC_JMP_CLIENTREQ; break; 3307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break; 3308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Sys_int128: trcval = VEX_TRC_JMP_SYS_INT128; break; 3309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Yield: trcval = VEX_TRC_JMP_YIELD; break; 3310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_EmWarn: trcval = VEX_TRC_JMP_EMWARN; break; 3311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_EmFail: trcval = VEX_TRC_JMP_EMFAIL; break; 3312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_MapFail: trcval = VEX_TRC_JMP_MAPFAIL; break; 3313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_NoDecode: trcval = VEX_TRC_JMP_NODECODE; break; 3314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_TInval: trcval = VEX_TRC_JMP_TINVAL; break; 3315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_NoRedir: trcval = VEX_TRC_JMP_NOREDIR; break; 3316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_SigTRAP: trcval = VEX_TRC_JMP_SIGTRAP; break; 3317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_SigSEGV: trcval = VEX_TRC_JMP_SIGSEGV; break; 3318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_SigBUS: trcval = VEX_TRC_JMP_SIGBUS; break; 3319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Ijk_Boring: trcval = VEX_TRC_JMP_BORING; break; 3320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We don't expect to see the following being assisted. */ 3321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Ret: 3322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //case Ijk_Call: 3323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fallthrough */ 3324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppIRJumpKind(i->Min.XAssisted.jk); 3326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("emit_MIPSInstr.Min_XAssisted: unexpected jump kind"); 3327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(trcval != 0); 3329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/10, trcval, mode64); 3330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* move r9, VG_(disp_cp_xassisted) */ 3332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/9, 3333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (ULong)Ptr_to_ULong(disp_cp_xassisted), mode64); 3334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jalr $9 3335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop */ 3336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 9, 0, 31, 0, 9); // p += 4 3337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); // p += 4 3338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 3340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XAssisted.cond != MIPScc_AL) { 3341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 3342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng delta = delta / 4 - 3; 3343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta > 0 && delta < 40); 3344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lw $9, 316($10) // guest_COND 3345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng beq $9, $0, 2 3346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop*/ 3347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 35, 10, 9, 316); 3348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 4, 0, 9, (delta)); 3349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormR(ptmp, 0, 0, 0, 0, 0, 0); 3350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Load: { 3355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.Load.src; 3356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) { 3357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Load.dst, mode64); 3358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc, sz = i->Min.Load.sz; 3359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64 && (sz == 4 || sz == 8)) { 3360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* should be guaranteed to us by iselWordExpr_AMode */ 3361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am_addr->Mam.IR.index & 3)); 3362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 3365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 32; 3366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 3368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 33; 3369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 3371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 35; 3372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 3374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 55; 3375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 3376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc, r_dst, am_addr, mode64); 3382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (am_addr->tag == Mam_RR) { 3384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Load.dst, mode64); 3385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc, sz = i->Min.Load.sz; 3386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 3389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 32; 3390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 3392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 33; 3393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 3395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 35; 3396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 3398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 55; 3399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 3400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, opc, r_dst, am_addr, mode64); 3406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Store: { 3412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.Store.dst; 3413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) { 3414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.Store.src, mode64); 3415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc, sz = i->Min.Store.sz; 3416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64 && (sz == 4 || sz == 8)) { 3417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* should be guaranteed to us by iselWordExpr_AMode */ 3418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am_addr->Mam.IR.index & 3)); 3419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 3422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 40; 3423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 3425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 41; 3426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 3428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 43; 3429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 3431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 3432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 63; 3433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc, r_src, am_addr, mode64); 3439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (am_addr->tag == Mam_RR) { 3441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.Store.src, mode64); 3442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc, sz = i->Min.Store.sz; 3443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 3446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 40; 3447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 3449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 41; 3450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 3452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 43; 3453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 3455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 3456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 63; 3457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, opc, r_src, am_addr, mode64); 3463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LoadL: { 3468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.LoadL.src; 3469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(am_addr->Mam.IR.base, mode64); 3470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt idx = am_addr->Mam.IR.index; 3471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.LoadL.dst, mode64); 3472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 0x30, r_src, r_dst, idx); 3474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_StoreC: { 3477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.StoreC.dst; 3478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.StoreC.src, mode64); 3479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt idx = am_addr->Mam.IR.index; 3480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(am_addr->Mam.IR.base, mode64); 3481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 0x38, r_dst, r_src, idx); 3483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_RdWrLR: { 3486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt reg = iregNo(i->Min.RdWrLR.gpr, mode64); 3487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool wrLR = i->Min.RdWrLR.wrLR; 3488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (wrLR) 3489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkMoveReg(p, 31, reg); 3490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 3491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkMoveReg(p, reg, 31); 3492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // Floating point 3496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpLdSt: { 3498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.FpLdSt.addr; 3499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar sz = i->Min.FpLdSt.sz; 3500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 4 || sz == 8); 3501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 4) { 3502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt f_reg = fregNo(i->Min.FpLdSt.reg, mode64); 3503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.isLoad) { 3504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) 3505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x31, f_reg, am_addr, mode64); 3506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (am_addr->tag == Mam_RR) 3507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x31, f_reg, am_addr, mode64); 3508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) 3510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x39, f_reg, am_addr, mode64); 3511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (am_addr->tag == Mam_RR) 3512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x39, f_reg, am_addr, mode64); 3513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (sz == 8) { 3515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt f_reg = dregNo(i->Min.FpLdSt.reg); 3516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.isLoad) { 3517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) { 3518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x35, f_reg, am_addr, mode64); 3520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x31, f_reg, am_addr, mode64); 3522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x31, f_reg + 1, 3523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nextMIPSAModeFloat(am_addr), mode64); 3524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (am_addr->tag == Mam_RR) { 3526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x35, f_reg, am_addr, mode64); 3528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x31, f_reg, am_addr, mode64); 3530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x31, f_reg + 1, 3531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nextMIPSAModeFloat(am_addr), mode64); 3532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) { 3536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x3d, f_reg, am_addr, mode64); 3538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x39, f_reg, am_addr, mode64); 3540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x39, f_reg + 1, 3541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nextMIPSAModeFloat(am_addr), mode64); 3542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (am_addr->tag == Mam_RR) { 3544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x3d, f_reg, am_addr, mode64); 3546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x39, f_reg, am_addr, mode64); 3548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x39, f_reg + 1, 3549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nextMIPSAModeFloat(am_addr), mode64); 3550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpUnary: { 3558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.FpUnary.op) { 3559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MOVS: { // FP move 3560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x6); 3563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MOVD: { // FP move 3566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x6); 3569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ABSS: { // ABSS 3572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x5); 3575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ABSD: { // ABSD 3578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x5); 3581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_NEGS: { // ABSS 3584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x7); 3587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_NEGD: { // ABSD 3590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x7); 3593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTD: { //CVT.D 3596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x21); 3599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SQRTS: { //SQRT.S 3602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x04); 3605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SQRTD: { //SQRT.D 3608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x04); 3611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RSQRTS: { //RSQRT.S 3614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x16); 3617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RSQRTD: { //RSQRT.D 3620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x16); 3623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RECIPS: { //RECIP.S 3626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x15); 3629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_RECIPD: { //RECIP.D 3632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x15); 3635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpBinary: { 3644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.FpBinary.op) { 3645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ADDS: { 3646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpBinary.dst, mode64); 3647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Min.FpBinary.srcL, mode64); 3648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Min.FpBinary.srcR, mode64); 3649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, fr_srcR, fr_srcL, fr_dst, 0); 3650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SUBS: { 3653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpBinary.dst, mode64); 3654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Min.FpBinary.srcL, mode64); 3655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Min.FpBinary.srcR, mode64); 3656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, fr_srcR, fr_srcL, fr_dst, 1); 3657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MULS: { 3660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpBinary.dst, mode64); 3661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Min.FpBinary.srcL, mode64); 3662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Min.FpBinary.srcR, mode64); 3663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, fr_srcR, fr_srcL, fr_dst, 2); 3664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_DIVS: { 3667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpBinary.dst, mode64); 3668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Min.FpBinary.srcL, mode64); 3669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Min.FpBinary.srcR, mode64); 3670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, fr_srcR, fr_srcL, fr_dst, 3); 3671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ADDD: { 3674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpBinary.dst); 3675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpBinary.srcL); 3676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpBinary.srcR); 3677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, fr_srcR, fr_srcL, fr_dst, 0); 3678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SUBD: { 3681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpBinary.dst); 3682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpBinary.srcL); 3683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpBinary.srcR); 3684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, fr_srcR, fr_srcL, fr_dst, 1); 3685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MULD: { 3688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpBinary.dst); 3689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpBinary.srcL); 3690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpBinary.srcR); 3691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, fr_srcR, fr_srcL, fr_dst, 2); 3692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_DIVD: { 3695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpBinary.dst); 3696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpBinary.srcL); 3697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpBinary.srcR); 3698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, fr_srcR, fr_srcL, fr_dst, 3); 3699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpConvert: { 3708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.FpConvert.op) { 3709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst, fr_src; 3710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTSD: 3711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x20); 3714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTSW: 3716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x14, 0, fr_src, fr_dst, 0x20); 3719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTWD: 3721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x24); 3724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTWS: 3726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x24); 3729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTDW: 3731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = dregNo(i->Min.FpConvert.dst); 3732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x14, 0, fr_src, fr_dst, 0x21); 3734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRUWS: 3736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0D); 3739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRUWD: 3741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0D); 3744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRULS: 3746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x09); 3749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRULD: 3751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = dregNo(i->Min.FpConvert.dst); 3752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x09); 3754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILWS: 3756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0E); 3759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILWD: 3761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0E); 3764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILLS: 3766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = dregNo(i->Min.FpConvert.dst); 3767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0A); 3769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILLD: 3771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = dregNo(i->Min.FpConvert.dst); 3772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0A); 3774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ROUNDWS: 3776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0C); 3779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ROUNDWD: 3781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0C); 3784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_FLOORWS: 3786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0F); 3789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_FLOORWD: 3791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0F); 3794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpCompare: { 3803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.FpCompare.dst, mode64); 3804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpCompare.srcL); 3805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpCompare.srcR); 3806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.FpConvert.op) { 3808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CMP: 3809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, fr_srcL, fr_srcR, 0, 3810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (i->Min.FpCompare.cond1 + 48)); 3811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x2, r_dst, 31, 0, 0); 3812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_EvCheck: { 3819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* This requires a 32-bit dec/test in 32 mode. */ 3820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We generate: 3821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lw r9, amCounter 3822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addiu r9, r9, -1 3823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sw r9, amCounter 3824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bgez r9, nofail 3825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lw r9, amFailAddr 3826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 3827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 3828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nofail: 3829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 3830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p0 = p; 3831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lw r9, amCounter */ 3832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word(p, True/*isLoad*/, /*r*/9, 3833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amCounter, mode64); 3834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addiu r9,r9,-1 */ 3835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 9, 9, 0xFFFF); 3836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* sw r30, amCounter */ 3837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word(p, False/*!isLoad*/, /*r*/9, 3838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amCounter, mode64); 3839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bgez t9, nofail */ 3840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 1, 9, 1, 3); 3841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lw r9, amFailAddr */ 3842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = do_load_or_store_machine_word(p, True/*isLoad*/, /*r*/9, 3843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amFailAddr, mode64); 3844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jalr $9 */ 3845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 9, 0, 31, 0, 9); // p += 4 3846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); // p += 4 3847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nofail: */ 3848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Crosscheck */ 3850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(evCheckSzB_MIPS() == (UChar*)p - (UChar*)p0); 3851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_ProfInc: { 3855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Generate a code template to increment a memory location whose 3856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng address will be known later as an immediate value. This code 3857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng template will be patched once the memory location is known. 3858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng For now we do this with address == 0x65556555. 3859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 32-bit: 3860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng move r9, 0x65556555 3862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lw r8, 0(r9) 3863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addiu r8, r8, 1 # add least significant word 3864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sw r8, 0(r9) 3865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sltiu r1, r8, 1 # set carry-in bit 3866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lw r8, 4(r9) 3867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addu r8, r8, r1 3868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sw r8, 4(r9) */ 3869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 3871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 3872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // move r9, 0x65556555 3874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/9, 0x65556555ULL, 3875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng False/*!mode64*/); 3876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lw r8, 0(r9) 3877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 35, 9, 8, 0); 3878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // addiu r8, r8, 1 # add least significant word 3880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 8, 8, 1); 3881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // sw r8, 0(r9) 3883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 43, 9, 8, 0); 3884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // sltiu r1, r8, 1 # set carry-in bit 3886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 11, 8, 1, 1); 3887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // lw r8, 4(r9) 3889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 35, 9, 8, 4); 3890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // addu r8, r8, r1 3892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 8, 1, 8, 0, 33); 3893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // sw r8, 4(r9) 3895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 43, 9, 8, 4); 3896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Tell the caller .. */ 3899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!(*is_profInc)); 3900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *is_profInc = True; 3901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bad: 3910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("\n=> "); 3911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSInstr(i, mode64); 3912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("emit_MIPSInstr"); 3913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /*NOTREACHED*/ done: 3914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng //vassert(p - &buf[0] <= 32); 3915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p - &buf[0]; 3916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check? See case for Min_EvCheck in 3919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emit_MIPSInstr just above. That crosschecks what this returns, so 3920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we can tell if we're inconsistent. */ 3921663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt evCheckSzB_MIPS ( void ) 3922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt kInstrSize = 4; 3924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 7*kInstrSize; 3925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the 3928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emitInstr case for XDirect, above. */ 3929663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange chainXDirect_MIPS ( void* place_to_chain, 3930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_EXPECTED, 3931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to, 3932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 3933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* What we're expecting to see is: 3935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng move r9, disp_cp_chain_me_to_EXPECTED 3936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 3937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 3938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 3939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 3940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x120F809 // jalr r9 3941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x00000000 // nop 3942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 3943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_chain; 3944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 3945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/9, 3946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (UInt)Ptr_to_ULong(disp_cp_chain_me_EXPECTED), 3947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64)); 3948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x120F809); 3949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x00000000); 3950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* And what we want to change it to is either: 3951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng move r9, place_to_jump_to 3952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 3953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 3954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 3955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 bytes generated by mkLoadImm_EXACTLY2or5> 3956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x120F809 // jalr r9 3957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x00000000 // nop 3958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The replacement has the same length as the original. 3960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 3961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/9, 3963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(place_to_jump_to), mode64); 3964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x120F809); 3965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x00000000); 3966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = p - (UChar*)place_to_chain; 3968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == (mode64 ? 28 : 16)); /* stay sane */ 3969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_chain, len}; 3970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 3971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 3972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the 3974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emitInstr case for XDirect, above. */ 3975663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange unchainXDirect_MIPS ( void* place_to_unchain, 3976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to_EXPECTED, 3977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me, 3978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 3979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 3980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* What we're expecting to see is: 3981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng move r9, place_to_jump_to_EXPECTED 3982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 3983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 3984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 3985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 3986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x120F809 // jalr r9 3987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x00000000 // nop 3988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 3989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_unchain; 3990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 3991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5(p, /*r*/9, 3992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(place_to_jump_to_EXPECTED), 3993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64)); 3994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x120F809); 3995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x00000000); 3996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* And what we want to change it to is: 3997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng move r9, disp_cp_chain_me 3998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 3999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 4000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 4001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng <8 or 20 bytes generated by mkLoadImm_EXACTLY2or5> 4002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x120F809 // jalr r9 4003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0x00000000 // nop 4004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The replacement has the same length as the original. 4005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 4006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/9, 4007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(disp_cp_chain_me), mode64); 4008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x120F809); 4009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x00000000); 4010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = p - (UChar*)place_to_unchain; 4012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(len == (mode64 ? 28 : 16)); /* stay sane */ 4013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_unchain, len}; 4014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 4015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 4016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter address into a profile inc point, as previously 4018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng created by the Min_ProfInc case for emit_MIPSInstr. */ 4019663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange patchProfInc_MIPS ( void* place_to_patch, 4020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ULong* location_of_counter, Bool mode64 ) 4021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 4022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sizeof(ULong*) == 4); 4023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_patch; 4024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 4025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(isLoadImm_EXACTLY2or5((UChar *)p, /*r*/9, 0x65556555, mode64)); 4026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 0) == 0x8D280000); 4028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 4) == 0x25080001); 4029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 8) == 0xAD280000); 4030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 12) == 0x2d010001); 4031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 16) == 0x8d280004); 4032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 20) == 0x01014021); 4033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(fetch32(p + (mode64 ? 20 : 8) + 24) == 0xad280004); 4034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm_EXACTLY2or5(p, /*r*/9, 4036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(location_of_counter), mode64); 4037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)p, 8}; 4039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 4040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 4041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---------------------------------------------------------------*/ 4044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- end host_mips_defs.c ---*/ 4045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---------------------------------------------------------------*/ 4046