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 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2010-2013 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 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* guest_COND offset. */ 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define COND_OFFSET(__mode64) (__mode64 ? 612 : 448) 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Register number for guest state pointer in host code. */ 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define GuestSP 23 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define MkHRegGPR(_n, _mode64) \ 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mkHReg(_n, _mode64 ? HRcInt64 : HRcInt32, False) 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define MkHRegFPR(_n, _mode64) \ 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mkHReg(_n, _mode64 ? HRcFlt64 : HRcFlt32, False) 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---------------- Registers ----------------*/ 52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid ppHRegMIPS(HReg reg, Bool mode64) 54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int r; 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov static const HChar *ireg32_names[35] 57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng = { "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31", 61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "%32", "%33", "%34", 62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng }; 63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov static const HChar *freg32_names[32] 65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng = { "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", 66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", 67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", 68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "f30", "$f31" 69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng }; 70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov static const HChar *freg64_names[32] 72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng = { "$d0", "$d1", "$d2", "$d3", "$d4", "$d5", "$d6", "$d7", 73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "$d8", "$d9", "$d10", "$d11", "$d12", "$d13", "$d14", "$d15", 74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng }; 75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Be generic for all virtual regs. */ 77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (hregIsVirtual(reg)) { 78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHReg(reg); 79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* But specific for real regs. */ 83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(hregClass(reg) == HRcInt32 || hregClass(reg) == HRcInt64 || 84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov hregClass(reg) == HRcFlt32 || hregClass(reg) == HRcFlt64); 85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* But specific for real regs. */ 87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (hregClass(reg)) { 88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcInt32: 89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov r = hregNumber(reg); 90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(r >= 0 && r < 32); 91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s", ireg32_names[r]); 92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcInt64: 94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov r = hregNumber (reg); 95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert (r >= 0 && r < 32); 96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf ("%s", ireg32_names[r]); 97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcFlt32: 99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov r = hregNumber(reg); 100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(r >= 0 && r < 32); 101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s", freg32_names[r]); 102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case HRcFlt64: 104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov r = hregNumber(reg); 105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(r >= 0 && r < 32); 106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s", freg64_names[r]); 107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("ppHRegMIPS"); 110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 116663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR0(Bool mode64) 117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(0, mode64); 119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 121663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR1(Bool mode64) 122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(1, mode64); 124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 126663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR2(Bool mode64) 127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(2, mode64); 129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 131663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR3(Bool mode64) 132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(3, mode64); 134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 136663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR4(Bool mode64) 137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(4, mode64); 139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 141663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR5(Bool mode64) 142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(5, mode64); 144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 146663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR6(Bool mode64) 147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(6, mode64); 149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 151663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR7(Bool mode64) 152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(7, mode64); 154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 156663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR8(Bool mode64) 157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(8, mode64); 159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 161663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR9(Bool mode64) 162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(9, mode64); 164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 166663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR10(Bool mode64) 167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(10, mode64); 169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 171663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR11(Bool mode64) 172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(11, mode64); 174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 176663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR12(Bool mode64) 177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(12, mode64); 179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 181663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR13(Bool mode64) 182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(13, mode64); 184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 186663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR14(Bool mode64) 187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(14, mode64); 189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 191663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR15(Bool mode64) 192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(15, mode64); 194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 196663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR16(Bool mode64) 197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(16, mode64); 199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 201663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR17(Bool mode64) 202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(17, mode64); 204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 206663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR18(Bool mode64) 207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(18, mode64); 209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 211663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR19(Bool mode64) 212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(19, mode64); 214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 216663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR20(Bool mode64) 217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(20, mode64); 219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 221663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR21(Bool mode64) 222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(21, mode64); 224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 226663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR22(Bool mode64) 227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(22, mode64); 229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 231663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR23(Bool mode64) 232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(23, mode64); 234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 236663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR24(Bool mode64) 237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(24, mode64); 239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 241663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR25(Bool mode64) 242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(25, mode64); 244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 246663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR26(Bool mode64) 247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(26, mode64); 249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 251663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR27(Bool mode64) 252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(27, mode64); 254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 256663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR28(Bool mode64) 257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(28, mode64); 259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 261663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR29(Bool mode64) 262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(29, mode64); 264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 266663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR30(Bool mode64) 267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(30, mode64); 269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 271663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_GPR31(Bool mode64) 272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegGPR(31, mode64); 274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 276663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F0(Bool mode64) 277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(0, mode64); 279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 281663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F1(Bool mode64) 282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(1, mode64); 284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 286663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F2(Bool mode64) 287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(2, mode64); 289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 291663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F3(Bool mode64) 292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(3, mode64); 294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 296663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F4(Bool mode64) 297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(4, mode64); 299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 301663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F5(Bool mode64) 302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(5, mode64); 304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 306663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F6(Bool mode64) 307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(6, mode64); 309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 311663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F7(Bool mode64) 312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(7, mode64); 314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 316663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F8(Bool mode64) 317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(8, mode64); 319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 321663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F9(Bool mode64) 322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(9, mode64); 324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 326663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F10(Bool mode64) 327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(10, mode64); 329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 331663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F11(Bool mode64) 332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(11, mode64); 334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 336663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F12(Bool mode64) 337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(12, mode64); 339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 341663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F13(Bool mode64) 342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(13, mode64); 344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 346663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F14(Bool mode64) 347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(14, mode64); 349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 351663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F15(Bool mode64) 352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(15, mode64); 354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 356663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F16(Bool mode64) 357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(16, mode64); 359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 361663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F17(Bool mode64) 362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(17, mode64); 364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 366663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F18(Bool mode64) 367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(18, mode64); 369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 371663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F19(Bool mode64) 372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(19, mode64); 374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 376663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F20(Bool mode64) 377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(20, mode64); 379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 381663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F21(Bool mode64) 382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(21, mode64); 384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 386663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F22(Bool mode64) 387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(22, mode64); 389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 391663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F23(Bool mode64) 392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(23, mode64); 394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 396663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F24(Bool mode64) 397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(24, mode64); 399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 401663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F25(Bool mode64) 402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(25, mode64); 404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 406663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F26(Bool mode64) 407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(26, mode64); 409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 411663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F27(Bool mode64) 412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(27, mode64); 414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 416663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F28(Bool mode64) 417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(28, mode64); 419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 421663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F29(Bool mode64) 422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(29, mode64); 424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 426663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F30(Bool mode64) 427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(30, mode64); 429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 431663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_F31(Bool mode64) 432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return MkHRegFPR(31, mode64); 434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 436663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_PC(Bool mode64) 437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(32, mode64 ? HRcFlt64 : HRcFlt32, False); 439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 441663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_HI(Bool mode64) 442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(33, mode64 ? HRcFlt64 : HRcFlt32, False); 444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 446663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_LO(Bool mode64) 447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(34, mode64 ? HRcFlt64 : HRcFlt32, False); 449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 451663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D0(void) 452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(0, HRcFlt64, False); 454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 456663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D1(void) 457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(2, HRcFlt64, False); 459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 461663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D2(void) 462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(4, HRcFlt64, False); 464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 466663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D3(void) 467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(6, HRcFlt64, False); 469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 471663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D4(void) 472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(8, HRcFlt64, False); 474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 476663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D5(void) 477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(10, HRcFlt64, False); 479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 481663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D6(void) 482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(12, HRcFlt64, False); 484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 486663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D7(void) 487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(14, HRcFlt64, False); 489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 491663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D8(void) 492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(16, HRcFlt64, False); 494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 496663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D9(void) 497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(18, HRcFlt64, False); 499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 501663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D10(void) 502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(20, HRcFlt64, False); 504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 506663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D11(void) 507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(22, HRcFlt64, False); 509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 511663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D12(void) 512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(24, HRcFlt64, False); 514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 516663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D13(void) 517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(26, HRcFlt64, False); 519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 521663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D14(void) 522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(28, HRcFlt64, False); 524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 526663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_D15(void) 527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(30, HRcFlt64, False); 529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 531663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FIR(void) 532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(35, HRcInt32, False); 534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 536663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FCCR(void) 537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(36, HRcInt32, False); 539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 541663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FEXR(void) 542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(37, HRcInt32, False); 544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 546663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FENR(void) 547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(38, HRcInt32, False); 549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 551663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_FCSR(void) 552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(39, HRcInt32, False); 554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 556663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengHReg hregMIPS_COND(void) 557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mkHReg(47, HRcInt32, False); 559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid getAllocableRegs_MIPS(Int * nregs, HReg ** arr, Bool mode64) 562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* The list of allocable registers is shorten to fit MIPS32 mode on Loongson. 564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov More precisely, we workaround Loongson MIPS32 issues by avoiding usage of 565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov odd single precision FP registers. */ 566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) 567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *nregs = 20; 568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *nregs = 28; 570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt i = 0; 571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *arr = LibVEX_Alloc(*nregs * sizeof(HReg)); 572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ZERO = constant 0 574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov AT = assembler temporary 575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov callee saves ones are listed first, since we prefer them 576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if they're available */ 577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR16(mode64); 578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR17(mode64); 579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR18(mode64); 580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR19(mode64); 581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR20(mode64); 582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR21(mode64); 583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR22(mode64); 584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR12(mode64); 586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR13(mode64); 587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR14(mode64); 588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR15(mode64); 589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_GPR24(mode64); 590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* s7 (=guest_state) */ 591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregMIPS_F16(mode64); 592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (*arr)[i++] = hregMIPS_F18(mode64); 593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F20(mode64); 594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F22(mode64); 595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F24(mode64); 596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F26(mode64); 597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F28(mode64); 598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_F30(mode64); 599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fake double floating point */ 601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D0(); 602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D1(); 603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D2(); 604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D3(); 605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D4(); 606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D5(); 607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D6(); 608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*arr)[i++] = hregMIPS_D7(); 609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i == *nregs); 611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*----------------- Condition Codes ----------------------*/ 615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar *showMIPSCondCode(MIPSCondCode cond) 617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* ret; 619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (cond) { 620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_EQ: 621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "EQ"; /* equal */ 622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_NE: 624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "NEQ"; /* not equal */ 625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_HS: 627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "GE"; /* >=u (Greater Than or Equal) */ 628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LO: 630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "LT"; /* <u (lower) */ 631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_MI: 633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "MI"; /* minus (negative) */ 634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_PL: 636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "PL"; /* plus (zero or +ve) */ 637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_VS: 639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "VS"; /* overflow */ 640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_VC: 642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "VC"; /* no overflow */ 643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_HI: 645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "HI"; /* >u (higher) */ 646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LS: 648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "LS"; /* <=u (lower or same) */ 649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_GE: 651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "GE"; /* >=s (signed greater or equal) */ 652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LT: 654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "LT"; /* <s (signed less than) */ 655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_GT: 657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "GT"; /* >s (signed greater) */ 658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LE: 660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "LE"; /* <=s (signed less or equal) */ 661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_AL: 663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "AL"; /* always (unconditional) */ 664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_NV: 666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "NV"; /* never (unconditional): */ 667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSCondCode"); 670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar *showMIPSFpOp(MIPSFpOp op) 676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar *ret; 678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ADDD: 680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "add.d"; 681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SUBD: 683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "sub.d"; 684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MULD: 686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "mul.d"; 687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_DIVD: 689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "div.d"; 690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MADDD: 692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "madd.d"; 693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MSUBD: 695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "msub.d"; 696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MADDS: 698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "madd.s"; 699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MSUBS: 701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "msub.s"; 702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ADDS: 704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "add.s"; 705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SUBS: 707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "sub.s"; 708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MULS: 710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "mul.s"; 711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_DIVS: 713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "div.s"; 714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SQRTS: 716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "sqrt.s"; 717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SQRTD: 719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "sqrt.d"; 720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ABSS: 722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "abs.s"; 723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ABSD: 725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "abs.d"; 726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_NEGS: 728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "neg.s"; 729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_NEGD: 731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "neg.d"; 732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MOVS: 734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "mov.s"; 735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MOVD: 737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "mov.d"; 738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ROUNDWS: 740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "round.w.s"; 741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ROUNDWD: 743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "round.w.d"; 744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_ROUNDLD: 746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "round.l.d"; 747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_FLOORWS: 749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "floor.w.s"; 750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_FLOORWD: 752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "floor.w.d"; 753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTDW: 755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "cvt.d.w"; 756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CVTDL: 758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "cvt.d.l"; 759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CVTDS: 761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "cvt.d.s"; 762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTSD: 764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "cvt.s.d"; 765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTSW: 767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "cvt.s.w"; 768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTWS: 770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "cvt.w.s"; 771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTWD: 773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "cvt.w.d"; 774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CVTLD: 776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "cvt.l.d"; 777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CVTLS: 779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "cvt.l.s"; 780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRUWD: 782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "trunc.w.d"; 783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRUWS: 785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "trunc.w.s"; 786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRULD: 788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "trunc.l.d"; 789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRULS: 791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "trunc.l.s"; 792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILWS: 794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "ceil.w.s"; 795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILWD: 797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "ceil.w.d"; 798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILLS: 800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "ceil.l.s"; 801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILLD: 803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "ceil.l.d"; 804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CMP_UN: 806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "c.un.d"; 807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CMP_EQ: 809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "c.eq.d"; 810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CMP_LT: 812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "c.lt.d"; 813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CMP_NGT: 815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "c.ngt.d"; 816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("Unknown op: %d", op); 819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSFpOp"); 820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Show move from/to fpr to/from gpr */ 826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* showMIPSFpGpMoveOp ( MIPSFpGpMoveOp op ) 827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar *ret; 829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpGpMove_mfc1: 831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "mfc1"; 832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpGpMove_dmfc1: 834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "dmfc1"; 835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpGpMove_mtc1: 837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "mtc1"; 838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpGpMove_dmtc1: 840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "dmtc1"; 841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("showMIPSFpGpMoveOp"); 844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return ret; 847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Show floating point move conditional */ 850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar* showMIPSMoveCondOp ( MIPSMoveCondOp op ) 851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar *ret; 853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (op) { 854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpMoveCond_movns: 855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "movn.s"; 856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpMoveCond_movnd: 858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "movn.d"; 859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MMoveCond_movn: 861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "movn"; 862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vpanic("showMIPSFpMoveCondOp"); 865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return ret; 868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- MIPSAMode: memory address expressions. --------- */ 871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 872663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *MIPSAMode_IR(Int idx, HReg base) 873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am = LibVEX_Alloc(sizeof(MIPSAMode)); 875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->tag = Mam_IR; 876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.IR.base = base; 877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.IR.index = idx; 878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return am; 880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 882663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *MIPSAMode_RR(HReg idx, HReg base) 883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am = LibVEX_Alloc(sizeof(MIPSAMode)); 885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->tag = Mam_RR; 886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.RR.base = base; 887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.RR.index = idx; 888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return am; 890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 892663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *dopyMIPSAMode(MIPSAMode * am) 893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode* ret; 895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = MIPSAMode_IR(am->Mam.IR.index, am->Mam.IR.base); 898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = MIPSAMode_RR(am->Mam.RR.index, am->Mam.RR.base); 901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("dopyMIPSAMode"); 904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 909663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *nextMIPSAModeFloat(MIPSAMode * am) 910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode* ret; 912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = MIPSAMode_IR(am->Mam.IR.index + 4, am->Mam.IR.base); 915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = MIPSAMode_RR(mkHReg(hregNumber(am->Mam.RR.index) + 1, 918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov hregClass(am->Mam.RR.index), 919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov hregIsVirtual(am->Mam.RR.index)), 920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->Mam.RR.base); 921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("dopyMIPSAMode"); 924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 929663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSAMode *nextMIPSAModeInt(MIPSAMode * am) 930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode* ret; 932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = MIPSAMode_IR(am->Mam.IR.index + 4, am->Mam.IR.base); 935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = MIPSAMode_RR(mkHReg(hregNumber(am->Mam.RR.index) + 1, 938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov hregClass(am->Mam.RR.index), 939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov hregIsVirtual(am->Mam.RR.index)), 940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov am->Mam.RR.base); 941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("dopyMIPSAMode"); 944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid ppMIPSAMode(MIPSAMode * am, Bool mode64) 950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am->Mam.IR.index == 0) 954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("0("); 955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%d(", (Int) am->Mam.IR.index); 957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(am->Mam.IR.base, mode64); 958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(")"); 959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(am->Mam.RR.base, mode64); 962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(am->Mam.RR.index, mode64); 964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("ppMIPSAMode"); 967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void addRegUsage_MIPSAMode(HRegUsage * u, MIPSAMode * am) 972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, am->Mam.IR.base); 976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, am->Mam.RR.base); 979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, am->Mam.RR.index); 980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("addRegUsage_MIPSAMode"); 983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void mapRegs_MIPSAMode(HRegRemap * m, MIPSAMode * am) 988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.IR.base = lookupHRegRemap(m, am->Mam.IR.base); 992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.RR.base = lookupHRegRemap(m, am->Mam.RR.base); 995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am->Mam.RR.index = lookupHRegRemap(m, am->Mam.RR.index); 996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("mapRegs_MIPSAMode"); 999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- Operand, which can be a reg or a u16/s16. --------- */ 1004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1005663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSRH *MIPSRH_Imm(Bool syned, UShort imm16) 1006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *op = LibVEX_Alloc(sizeof(MIPSRH)); 1008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->tag = Mrh_Imm; 1009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->Mrh.Imm.syned = syned; 1010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->Mrh.Imm.imm16 = imm16; 1011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* If this is a signed value, ensure it's not -32768, so that we 1012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng are guaranteed always to be able to negate if needed. */ 1013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) 1014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(imm16 != 0x8000); 1015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(syned == True || syned == False); 1016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return op; 1017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1019663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSRH *MIPSRH_Reg(HReg reg) 1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *op = LibVEX_Alloc(sizeof(MIPSRH)); 1022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->tag = Mrh_Reg; 1023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->Mrh.Reg.reg = reg; 1024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return op; 1025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid ppMIPSRH(MIPSRH * op, Bool mode64) 1028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRHTag tag = op->tag; 1030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (tag) { 1031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Imm: 1032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (op->Mrh.Imm.syned) 1033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%d", (Int) (Short) op->Mrh.Imm.imm16); 1034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%u", (UInt) (UShort) op->Mrh.Imm.imm16); 1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Reg: 1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(op->Mrh.Reg.reg, mode64); 1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("ppMIPSRH"); 1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* An MIPSRH can only be used in a "read" context (what would it mean 1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng to write or modify a literal?) and so we enumerate its registers 1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng accordingly. */ 1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void addRegUsage_MIPSRH(HRegUsage * u, MIPSRH * op) 1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op->tag) { 1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Imm: 1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Reg: 1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, op->Mrh.Reg.reg); 1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("addRegUsage_MIPSRH"); 1059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void mapRegs_MIPSRH(HRegRemap * m, MIPSRH * op) 1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op->tag) { 1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Imm: 1067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mrh_Reg: 1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op->Mrh.Reg.reg = lookupHRegRemap(m, op->Mrh.Reg.reg); 1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("mapRegs_MIPSRH"); 1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- Instructions. --------- */ 1078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar *showMIPSUnaryOp(MIPSUnaryOp op) 1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* ret; 1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mun_CLO: 1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "clo"; 1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mun_CLZ: 1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "clz"; 1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mun_NOP: 1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "nop"; 1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mun_DCLO: 1093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "dclo"; 1094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 1095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mun_DCLZ: 1096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = "dclz"; 1097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSUnaryOp"); 1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar *showMIPSAluOp(MIPSAluOp op, Bool immR) 1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar* ret; 1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_ADD: 1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? "addiu" : "addu"; 1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_SUB: 1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "subu"; 1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_AND: 1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? "andi" : "and"; 1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_OR: 1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? "ori" : "or"; 1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_NOR: 1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(immR == False); /*there's no nor with an immediate operand!? */ 1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = "nor"; 1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_XOR: 1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? "xori" : "xor"; 1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Malu_DADD: 1129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = immR ? "daddi" : "dadd"; 1130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 1131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Malu_DSUB: 1132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = immR ? "dsubi" : "dsub"; 1133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 1134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Malu_SLT: 1135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = immR ? "slti" : "slt"; 1136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 1137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSAluOp"); 1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar *showMIPSShftOp(MIPSShftOp op, Bool immR, Bool sz32) 1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar *ret; 1147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 1148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SRA: 1149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = immR ? (sz32 ? "sra" : "dsra") : (sz32 ? "srav" : "dsrav"); 1150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SLL: 1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? (sz32 ? "sll" : "dsll") : (sz32 ? "sllv" : "dsllv"); 1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SRL: 1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = immR ? (sz32 ? "srl" : "dsrl") : (sz32 ? "srlv" : "dsrlv"); 1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSShftOp"); 1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst HChar *showMIPSMaccOp(MIPSMaccOp op, Bool variable) 1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov const HChar *ret; 1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (op) { 1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_ADD: 1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = variable ? "madd" : "maddu"; 1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_SUB: 1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = variable ? "msub" : "msubu"; 1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("showMIPSAccOp"); 1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_LI(HReg dst, ULong imm) 1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_LI; 1185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LI.dst = dst; 1186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LI.imm = imm; 1187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1190663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Alu(MIPSAluOp op, HReg dst, HReg srcL, MIPSRH * srcR) 1191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Alu; 1194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Alu.op = op; 1195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Alu.dst = dst; 1196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Alu.srcL = srcL; 1197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Alu.srcR = srcR; 1198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1201663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Shft(MIPSShftOp op, Bool sz32, HReg dst, HReg srcL, 1202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH * srcR) 1203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Shft; 1206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.op = op; 1207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.sz32 = sz32; 1208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.dst = dst; 1209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.srcL = srcL; 1210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.srcR = srcR; 1211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1214663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Unary(MIPSUnaryOp op, HReg dst, HReg src) 1215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Unary; 1218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Unary.op = op; 1219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Unary.dst = dst; 1220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Unary.src = src; 1221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1224663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Cmp(Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR, 1225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond) 1226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Cmp; 1229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.syned = syned; 1230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.sz32 = sz32; 1231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.dst = dst; 1232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.srcL = srcL; 1233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.srcR = srcR; 1234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Cmp.cond = cond; 1235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* multiply */ 1239663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mul(Bool syned, Bool wid, Bool sz32, HReg dst, HReg srcL, 1240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg srcR) 1241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mul; 1244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.syned = syned; 1245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.widening = wid; /* widen=True else False */ 1246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.sz32 = sz32; /* True = 32 bits */ 1247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.dst = dst; 1248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.srcL = srcL; 1249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.srcR = srcR; 1250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* msub */ 1254663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Msub(Bool syned, HReg srcL, HReg srcR) 1255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Macc; 1258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.op = Macc_SUB; 1260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.syned = syned; 1261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.srcL = srcL; 1262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.srcR = srcR; 1263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* madd */ 1267663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Madd(Bool syned, HReg srcL, HReg srcR) 1268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Macc; 1271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.op = Macc_ADD; 1273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.syned = syned; 1274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.srcL = srcL; 1275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Macc.srcR = srcR; 1276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* div */ 1280663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Div(Bool syned, Bool sz32, HReg srcL, HReg srcR) 1281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Div; 1284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Div.syned = syned; 1285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Div.sz32 = sz32; /* True = 32 bits */ 1286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Div.srcL = srcL; 1287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Div.srcR = srcR; 1288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovMIPSInstr *MIPSInstr_Call ( MIPSCondCode cond, Addr64 target, UInt argiregs, 1292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src, RetLoc rloc ) 1293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt mask; 1295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Call; 1297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.cond = cond; 1298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.target = target; 1299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.argiregs = argiregs; 1300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.src = src; 1301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.Call.rloc = rloc; 1302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Only $4 .. $7/$11 inclusive may be used as arg regs. */ 1303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mask = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) 1304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov | (1 << 10) | (1 << 11); 1305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (argiregs & ~mask)); 1306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(is_sane_RetLoc(rloc)); 1307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovMIPSInstr *MIPSInstr_CallAlways ( MIPSCondCode cond, Addr64 target, 1311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt argiregs, RetLoc rloc ) 1312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt mask; 1314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Call; 1316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.cond = cond; 1317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.target = target; 1318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Call.argiregs = argiregs; 1319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.Call.rloc = rloc; 1320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Only $4 .. $7/$11 inclusive may be used as arg regs. */ 1321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mask = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) 1322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov | (1 << 10) | (1 << 11); 1323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (argiregs & ~mask)); 1324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(is_sane_RetLoc(rloc)); 1325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovMIPSInstr *MIPSInstr_XDirect ( Addr64 dstGA, MIPSAMode* amPC, 1329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond, Bool toFastEP ) { 1330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_XDirect; 1332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.dstGA = dstGA; 1333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.amPC = amPC; 1334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.cond = cond; 1335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.toFastEP = toFastEP; 1336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1339663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_XIndir ( HReg dstGA, MIPSAMode* amPC, 1340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond ) { 1341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_XIndir; 1343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.dstGA = dstGA; 1344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.amPC = amPC; 1345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.cond = cond; 1346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1349663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_XAssisted ( HReg dstGA, MIPSAMode* amPC, 1350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond, IRJumpKind jk ) { 1351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_XAssisted; 1353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XAssisted.dstGA = dstGA; 1354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XAssisted.amPC = amPC; 1355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XAssisted.cond = cond; 1356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XAssisted.jk = jk; 1357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1360663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Load(UChar sz, HReg dst, MIPSAMode * src, Bool mode64) 1361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Load; 1364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Load.sz = sz; 1365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Load.src = src; 1366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Load.dst = dst; 1367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8); 1368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 8) 1370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 1371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1374663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Store(UChar sz, MIPSAMode * dst, HReg src, Bool mode64) 1375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Store; 1378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Store.sz = sz; 1379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Store.src = src; 1380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Store.dst = dst; 1381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8); 1382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 8) 1384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 1385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1388663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_LoadL(UChar sz, HReg dst, MIPSAMode * src, Bool mode64) 1389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_LoadL; 1392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LoadL.sz = sz; 1393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LoadL.src = src; 1394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.LoadL.dst = dst; 1395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 4 || sz == 8); 1396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 8) 1398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 1399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1402663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_StoreC(UChar sz, MIPSAMode * dst, HReg src, Bool mode64) 1403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_StoreC; 1406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.StoreC.sz = sz; 1407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.StoreC.src = src; 1408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.StoreC.dst = dst; 1409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 4 || sz == 8); 1410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 8) 1412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 1413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1416663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mthi(HReg src) 1417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mthi; 1420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MtHL.src = src; 1421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1424663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mtlo(HReg src) 1425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mtlo; 1428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MtHL.src = src; 1429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1432663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mfhi(HReg dst) 1433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mfhi; 1436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MfHL.dst = dst; 1437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1440663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_Mflo(HReg dst) 1441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_Mflo; 1444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MfHL.dst = dst; 1445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Read/Write Link Register */ 1449663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_RdWrLR(Bool wrLR, HReg gpr) 1450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_RdWrLR; 1453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.RdWrLR.wrLR = wrLR; 1454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.RdWrLR.gpr = gpr; 1455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1458663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_FpLdSt(Bool isLoad, UChar sz, HReg reg, MIPSAMode * addr) 1459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpLdSt; 1462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.isLoad = isLoad; 1463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.sz = sz; 1464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.reg = reg; 1465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.addr = addr; 1466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 4 || sz == 8); 1467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1470663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_FpUnary(MIPSFpOp op, HReg dst, HReg src) 1471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpUnary; 1474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpUnary.op = op; 1475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpUnary.dst = dst; 1476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpUnary.src = src; 1477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1480663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_FpBinary(MIPSFpOp op, HReg dst, HReg srcL, HReg srcR) 1481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpBinary; 1484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpBinary.op = op; 1485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpBinary.dst = dst; 1486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpBinary.srcL = srcL; 1487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpBinary.srcR = srcR; 1488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovMIPSInstr *MIPSInstr_FpTernary ( MIPSFpOp op, HReg dst, HReg src1, HReg src2, 1492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg src3 ) 1493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 1494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = Min_FpTernary; 1496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.FpTernary.op = op; 1497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.FpTernary.dst = dst; 1498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.FpTernary.src1 = src1; 1499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.FpTernary.src2 = src2; 1500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.FpTernary.src3 = src3; 1501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1504663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_FpConvert(MIPSFpOp op, HReg dst, HReg src) 1505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpConvert; 1508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpConvert.op = op; 1509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpConvert.dst = dst; 1510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpConvert.src = src; 1511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovMIPSInstr *MIPSInstr_FpCompare(MIPSFpOp op, HReg dst, HReg srcL, HReg srcR) 1516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_FpCompare; 1519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpCompare.op = op; 1520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpCompare.dst = dst; 1521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpCompare.srcL = srcL; 1522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpCompare.srcR = srcR; 1523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1526663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_MtFCSR(HReg src) 1527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_MtFCSR; 1530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MtFCSR.src = src; 1531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1534663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_MfFCSR(HReg dst) 1535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_MfFCSR; 1538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.MfFCSR.dst = dst; 1539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovMIPSInstr *MIPSInstr_FpGpMove ( MIPSFpGpMoveOp op, HReg dst, HReg src ) 1543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 1544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = Min_FpGpMove; 1546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.FpGpMove.op = op; 1547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.FpGpMove.dst = dst; 1548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.FpGpMove.src = src; 1549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovMIPSInstr *MIPSInstr_MoveCond ( MIPSMoveCondOp op, HReg dst, HReg src, 1553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HReg cond ) 1554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 1555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov MIPSInstr *i = LibVEX_Alloc(sizeof(MIPSInstr)); 1556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->tag = Min_MoveCond; 1557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.MoveCond.op = op; 1558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.MoveCond.dst = dst; 1559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.MoveCond.src = src; 1560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.MoveCond.cond = cond; 1561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return i; 1562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1564663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr *MIPSInstr_EvCheck ( MIPSAMode* amCounter, 1565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode* amFailAddr ) { 1566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_EvCheck; 1568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amCounter = amCounter; 1569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amFailAddr = amFailAddr; 1570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1573663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengMIPSInstr* MIPSInstr_ProfInc ( void ) { 1574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSInstr* i = LibVEX_Alloc(sizeof(MIPSInstr)); 1575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->tag = Min_ProfInc; 1576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return i; 1577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------- Pretty Print instructions ------------- */ 1580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void ppLoadImm(HReg dst, ULong imm, Bool mode64) 1581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("li "); 1583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(dst, mode64); 1584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(",0x%016llx", imm); 1585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid ppMIPSInstr(MIPSInstr * i, Bool mode64) 1588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->tag) { 1590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LI: 1591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppLoadImm(i->Min.LI.dst, i->Min.LI.imm, mode64); 1592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Alu: { 1594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg r_srcL = i->Min.Alu.srcL; 1595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *rh_srcR = i->Min.Alu.srcR; 1596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* generic */ 1597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSAluOp(i->Min.Alu.op, 1598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng toBool(rh_srcR->tag == Mrh_Imm))); 1599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Alu.dst, mode64); 1600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(r_srcL, mode64); 1602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSRH(rh_srcR, mode64); 1604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Shft: { 1607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng HReg r_srcL = i->Min.Shft.srcL; 1608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *rh_srcR = i->Min.Shft.srcR; 1609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSShftOp(i->Min.Shft.op, 1610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng toBool(rh_srcR->tag == Mrh_Imm), 1611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Shft.sz32)); 1612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Shft.dst, mode64); 1613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(r_srcL, mode64); 1615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSRH(rh_srcR, mode64); 1617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Unary: { 1620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSUnaryOp(i->Min.Unary.op)); 1621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Unary.dst, mode64); 1622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Unary.src, mode64); 1624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Cmp: { 1627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("word_compare "); 1628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Cmp.dst, mode64); 1629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(" = %s ( ", showMIPSCondCode(i->Min.Cmp.cond)); 1630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Cmp.srcL, mode64); 1631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Cmp.srcR, mode64); 1633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(" )"); 1634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mul: { 1638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Mul.widening) { 1639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case False: 1640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mul "); 1641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.dst, mode64); 1642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.srcL, mode64); 1644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.srcR, mode64); 1646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case True: 1648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s%s ", i->Min.Mul.sz32 ? "mult" : "dmult", 1649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.Mul.syned ? "" : "u"); 1650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.dst, mode64); 1651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.srcL, mode64); 1653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Mul.srcR, mode64); 1655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mthi: { 1660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mthi "); 1661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MtHL.src, mode64); 1662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mtlo: { 1665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mtlo "); 1666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MtHL.src, mode64); 1667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mfhi: { 1670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mfhi "); 1671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MfHL.dst, mode64); 1672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mflo: { 1675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("mflo "); 1676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MfHL.dst, mode64); 1677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Macc: { 1680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSMaccOp(i->Min.Macc.op, i->Min.Macc.syned)); 1681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Macc.srcL, mode64); 1682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Macc.srcR, mode64); 1684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Div: { 1687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!i->Min.Div.sz32) 1688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("d"); 1689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("div"); 1690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", i->Min.Div.syned ? "s" : "u"); 1691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Div.srcL, mode64); 1692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Div.srcR, mode64); 1694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Call: { 1697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int n; 1698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("call: "); 1699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Call.cond != MIPScc_AL) { 1700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (%s) ", showMIPSCondCode(i->Min.Call.cond)); 1701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(" {"); 1703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (!mode64) 1704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(" addiu $29, $29, -16"); 1705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppLoadImm(hregMIPS_GPR25(mode64), i->Min.Call.target, mode64); 1707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(" ; jarl $31, $25; # args ["); 1709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (n = 0; n < 32; n++) { 1710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Call.argiregs & (1 << n)) { 1711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("$%d", n); 1712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if ((i->Min.Call.argiregs >> n) > 1) 1713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("] nop; "); 1717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (!mode64) 1718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("addiu $29, $29, 16; ]"); 1719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XDirect: 1723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xDirect) "); 1724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (guest_COND.%s) { ", 1725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showMIPSCondCode(i->Min.XDirect.cond)); 1726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("move $9, 0x%x,", (UInt)i->Min.XDirect.dstGA); 1727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; sw $9, "); 1728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.XDirect.amPC, mode64); 1729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; move $9, $disp_cp_chain_me_to_%sEP; jalr $9; nop}", 1730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XDirect.toFastEP ? "fast" : "slow"); 1731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XIndir: 1733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xIndir) "); 1734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (guest_COND.%s) { sw ", 1735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov showMIPSCondCode(i->Min.XIndir.cond)); 1736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.XIndir.dstGA, mode64); 1737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.XIndir.amPC, mode64); 1739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; move $9, $disp_indir; jalr $9; nop}"); 1740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XAssisted: 1742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(xAssisted) "); 1743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("if (guest_COND.%s) { ", 1744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng showMIPSCondCode(i->Min.XAssisted.cond)); 1745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("sw "); 1746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.XAssisted.dstGA, mode64); 1747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", "); 1748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.XAssisted.amPC, mode64); 1749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; move $9, $IRJumpKind_to_TRCVAL(%d)", 1750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (Int)i->Min.XAssisted.jk); 1751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; move $9, $disp_assisted; jalr $9; nop; }"); 1752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Load: { 1754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool idxd = toBool(i->Min.Load.src->tag == Mam_RR); 1755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar sz = i->Min.Load.sz; 1756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HChar c_sz = sz == 1 ? 'b' : sz == 2 ? 'h' : sz == 4 ? 'w' : 'd'; 1757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("l%c%s ", c_sz, idxd ? "x" : ""); 1758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Load.dst, mode64); 1759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.Load.src, mode64); 1761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Store: { 1764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar sz = i->Min.Store.sz; 1765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool idxd = toBool(i->Min.Store.dst->tag == Mam_RR); 1766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov HChar c_sz = sz == 1 ? 'b' : sz == 2 ? 'h' : sz == 4 ? 'w' : 'd'; 1767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("s%c%s ", c_sz, idxd ? "x" : ""); 1768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.Store.src, mode64); 1769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.Store.dst, mode64); 1771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LoadL: { 1774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("ll "); 1775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.LoadL.dst, mode64); 1776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.LoadL.src, mode64); 1778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_StoreC: { 1781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("sc "); 1782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.StoreC.src, mode64); 1783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.StoreC.dst, mode64); 1785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_RdWrLR: { 1788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", i->Min.RdWrLR.wrLR ? "mtlr" : "mflr"); 1789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.RdWrLR.gpr, mode64); 1790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpUnary: 1793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSFpOp(i->Min.FpUnary.op)); 1794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpUnary.dst, mode64); 1795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpUnary.src, mode64); 1797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpBinary: 1799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s", showMIPSFpOp(i->Min.FpBinary.op)); 1800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpBinary.dst, mode64); 1801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpBinary.srcL, mode64); 1803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpBinary.srcR, mode64); 1805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_FpTernary: 1807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s", showMIPSFpOp(i->Min.FpTernary.op)); 1808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegMIPS(i->Min.FpTernary.dst, mode64); 1809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 1810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegMIPS(i->Min.FpTernary.src1, mode64); 1811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 1812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegMIPS(i->Min.FpTernary.src2, mode64); 1813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(","); 1814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegMIPS(i->Min.FpTernary.src3, mode64); 1815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpConvert: 1817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s", showMIPSFpOp(i->Min.FpConvert.op)); 1818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpConvert.dst, mode64); 1819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpConvert.src, mode64); 1821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpCompare: 1823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSFpOp(i->Min.FpCompare.op)); 1824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpCompare.srcL, mode64); 1825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpCompare.srcR, mode64); 1827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpMulAcc: 1829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("%s ", showMIPSFpOp(i->Min.FpMulAcc.op)); 1830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpMulAcc.dst, mode64); 1831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpMulAcc.srcML, mode64); 1833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpMulAcc.srcMR, mode64); 1835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpMulAcc.srcAcc, mode64); 1837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpLdSt: { 1839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.sz == 4) { 1840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.isLoad) { 1841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("lwc1 "); 1842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpLdSt.reg, mode64); 1843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.FpLdSt.addr, mode64); 1845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("swc1 "); 1847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpLdSt.reg, mode64); 1848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.FpLdSt.addr, mode64); 1850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (i->Min.FpLdSt.sz == 8) { 1852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.isLoad) { 1853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ldc1 "); 1854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpLdSt.reg, mode64); 1855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.FpLdSt.addr, mode64); 1857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("sdc1 "); 1859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.FpLdSt.reg, mode64); 1860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(","); 1861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.FpLdSt.addr, mode64); 1862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MtFCSR: { 1867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ctc1 "); 1868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MtFCSR.src, mode64); 1869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", $31"); 1870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MfFCSR: { 1873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("ctc1 "); 1874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegMIPS(i->Min.MfFCSR.dst, mode64); 1875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf(", $31"); 1876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_FpGpMove: { 1879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s ", showMIPSFpGpMoveOp(i->Min.FpGpMove.op)); 1880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegMIPS(i->Min.FpGpMove.dst, mode64); 1881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegMIPS(i->Min.FpGpMove.src, mode64); 1883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_MoveCond: { 1886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("%s", showMIPSMoveCondOp(i->Min.MoveCond.op)); 1887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegMIPS(i->Min.MoveCond.dst, mode64); 1888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegMIPS(i->Min.MoveCond.src, mode64); 1890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf(", "); 1891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ppHRegMIPS(i->Min.MoveCond.cond, mode64); 1892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 1893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_EvCheck: 1895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("(evCheck) lw $9, "); 1896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.EvCheck.amCounter, mode64); 1897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; addiu $9, $9, -1"); 1898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; sw $9, "); 1899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.EvCheck.amCounter, mode64); 1900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; bgez $t9, nofail; jalr *"); 1901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSAMode(i->Min.EvCheck.amFailAddr, mode64); 1902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("; nofail:"); 1903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_ProfInc: 1905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (mode64) 1906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(profInc) move $9, ($NotKnownYet); " 1907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "ld $8, 0($9); " 1908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "daddiu $8, $8, 1; " 1909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "sd $8, 0($9); " ); 1910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 1911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vex_printf("(profInc) move $9, ($NotKnownYet); " 1912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "lw $8, 0($9); " 1913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "addiu $8, $8, 1; " 1914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "sw $8, 0($9); " 1915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "sltiu $1, $8, 1; " 1916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "lw $8, 4($9); " 1917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "addu $8, $8, $1; " 1918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "sw $8, 4($9); " ); 1919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("ppMIPSInstr"); 1922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- Helpers for register allocation. --------- */ 1927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid getRegUsage_MIPSInstr(HRegUsage * u, MIPSInstr * i, Bool mode64) 1929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng initHRegUsage(u); 1931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->tag) { 1932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LI: 1933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.LI.dst); 1934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Alu: 1936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Alu.srcL); 1937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSRH(u, i->Min.Alu.srcR); 1938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Alu.dst); 1939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Shft: 1941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Shft.srcL); 1942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSRH(u, i->Min.Shft.srcR); 1943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Shft.dst); 1944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Cmp: 1946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Cmp.srcL); 1947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Cmp.srcR); 1948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Cmp.dst); 1949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Unary: 1951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Unary.src); 1952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Unary.dst); 1953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mul: 1955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Mul.dst); 1956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Mul.srcL); 1957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Mul.srcR); 1958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mthi: 1960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mtlo: 1961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_HI(mode64)); 1962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_LO(mode64)); 1963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.MtHL.src); 1964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mfhi: 1966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mflo: 1967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, hregMIPS_HI(mode64)); 1968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, hregMIPS_LO(mode64)); 1969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.MfHL.dst); 1970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MtFCSR: 1972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.MtFCSR.src); 1973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MfFCSR: 1975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.MfFCSR.dst); 1976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Macc: 1978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmModify, hregMIPS_HI(mode64)); 1979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmModify, hregMIPS_LO(mode64)); 1980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Macc.srcL); 1981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Macc.srcR); 1982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Div: 1984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_HI(mode64)); 1985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_LO(mode64)); 1986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Div.srcL); 1987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Div.srcR); 1988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 1989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Call: { 1990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Logic and comments copied/modified from x86, ppc and arm back end. 1991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov First off, claim it trashes all the caller-saved regs 1992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov which fall within the register allocator's jurisdiction. */ 1993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Call.cond != MIPScc_AL) 1994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Call.src); 1995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt argir; 1996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR1(mode64)); 1997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR2(mode64)); 1999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR3(mode64)); 2000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR4(mode64)); 2002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR5(mode64)); 2003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR6(mode64)); 2004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR7(mode64)); 2005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR8(mode64)); 2007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR9(mode64)); 2008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR10(mode64)); 2009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR11(mode64)); 2010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR12(mode64)); 2011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR13(mode64)); 2012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR14(mode64)); 2013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR15(mode64)); 2014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR24(mode64)); 2016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, hregMIPS_GPR25(mode64)); 2017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, hregMIPS_GPR31(mode64)); 2018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Now we have to state any parameter-carrying registers 2020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov which might be read. This depends on the argiregs field. */ 2021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng argir = i->Min.Call.argiregs; 2022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (argir & (1<<11)) addHRegUse(u, HRmRead, hregMIPS_GPR11(mode64)); 2023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (argir & (1<<10)) addHRegUse(u, HRmRead, hregMIPS_GPR10(mode64)); 2024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (argir & (1<<9)) addHRegUse(u, HRmRead, hregMIPS_GPR9(mode64)); 2025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (argir & (1<<8)) addHRegUse(u, HRmRead, hregMIPS_GPR8(mode64)); 2026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (argir & (1<<7)) addHRegUse(u, HRmRead, hregMIPS_GPR7(mode64)); 2027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (argir & (1<<6)) addHRegUse(u, HRmRead, hregMIPS_GPR6(mode64)); 2028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (argir & (1<<5)) addHRegUse(u, HRmRead, hregMIPS_GPR5(mode64)); 2029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (argir & (1<<4)) addHRegUse(u, HRmRead, hregMIPS_GPR4(mode64)); 2030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (argir & ~((1 << 4) | (1 << 5) | (1 << 6) 2032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) 2033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov | (1 << 11)))); 2034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* XDirect/XIndir/XAssisted are also a bit subtle. They 2038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng conditionally exit the block. Hence we only need to list (1) 2039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng the registers that they read, and (2) the registers that they 2040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng write in the case where the block is not exited. (2) is 2041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng empty, hence only (1) is relevant here. */ 2042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XDirect: 2043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.XDirect.amPC); 2044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XIndir: 2046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.XIndir.dstGA); 2047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.XIndir.amPC); 2048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XAssisted: 2050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.XAssisted.dstGA); 2051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.XAssisted.amPC); 2052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Load: 2054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.Load.src); 2055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.Load.dst); 2056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Store: 2058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.Store.src); 2059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.Store.dst); 2060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LoadL: 2062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.LoadL.src); 2063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.LoadL.dst); 2064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_StoreC: 2066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.StoreC.src); 2067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.StoreC.src); 2068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.StoreC.dst); 2069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_RdWrLR: 2071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, (i->Min.RdWrLR.wrLR ? HRmRead : HRmWrite), 2072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.RdWrLR.gpr); 2073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpLdSt: 2075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.sz == 4) { 2076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, (i->Min.FpLdSt.isLoad ? HRmWrite : HRmRead), 2077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.FpLdSt.reg); 2078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.FpLdSt.addr); 2079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (i->Min.FpLdSt.sz == 8) { 2081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, (i->Min.FpLdSt.isLoad ? HRmWrite : HRmRead), 2082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.FpLdSt.reg); 2083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addRegUsage_MIPSAMode(u, i->Min.FpLdSt.addr); 2084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpUnary: 2088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->Min.FpUnary.dst); 2089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Min.FpUnary.src); 2090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpBinary: 2092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.FpBinary.dst); 2093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpBinary.srcL); 2094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpBinary.srcR); 2095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_FpTernary: 2097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->Min.FpTernary.dst); 2098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Min.FpTernary.src1); 2099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Min.FpTernary.src2); 2100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Min.FpTernary.src3); 2101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpConvert: 2103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.FpConvert.dst); 2104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpConvert.src); 2105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpCompare: 2107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmWrite, i->Min.FpCompare.dst); 2108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpCompare.srcL); 2109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addHRegUse(u, HRmRead, i->Min.FpCompare.srcR); 2110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_FpGpMove: 2112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmWrite, i->Min.FpGpMove.dst); 2113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Min.FpGpMove.src); 2114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_MoveCond: 2116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmModify, i->Min.MoveCond.dst); 2117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Min.MoveCond.src); 2118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addHRegUse(u, HRmRead, i->Min.MoveCond.cond); 2119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_EvCheck: 2121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We expect both amodes only to mention %ebp, so this is in 2122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fact pointless, since %ebp isn't allocatable, but anyway.. */ 2123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.EvCheck.amCounter); 2124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addRegUsage_MIPSAMode(u, i->Min.EvCheck.amFailAddr); 2125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_ProfInc: 2127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* does not use any registers. */ 2128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSInstr(i, mode64); 2131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("getRegUsage_MIPSInstr"); 2132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* local helper */ 2137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void mapReg(HRegRemap * m, HReg * r) 2138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *r = lookupHRegRemap(m, *r); 2140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid mapRegs_MIPSInstr(HRegRemap * m, MIPSInstr * i, Bool mode64) 2143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->tag) { 2145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LI: 2146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.LI.dst); 2147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Alu: 2149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Alu.srcL); 2150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSRH(m, i->Min.Alu.srcR); 2151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Alu.dst); 2152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Shft: 2154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Shft.srcL); 2155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSRH(m, i->Min.Shft.srcR); 2156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Shft.dst); 2157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Cmp: 2159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Cmp.srcL); 2160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Cmp.srcR); 2161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Cmp.dst); 2162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Unary: 2164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Unary.src); 2165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Unary.dst); 2166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mul: 2168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Mul.dst); 2169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Mul.srcL); 2170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Mul.srcR); 2171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mthi: 2173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mtlo: 2174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MtHL.src); 2175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mfhi: 2177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mflo: 2178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MfHL.dst); 2179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Macc: 2181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Macc.srcL); 2182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Macc.srcR); 2183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Div: 2185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Div.srcL); 2186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Div.srcR); 2187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Call: 2189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 2190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Call.cond != MIPScc_AL) 2191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Call.src); 2192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XDirect: 2195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.XDirect.amPC); 2196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XIndir: 2198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.XIndir.dstGA); 2199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.XIndir.amPC); 2200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XAssisted: 2202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.XAssisted.dstGA); 2203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.XAssisted.amPC); 2204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Load: 2206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.Load.src); 2207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Load.dst); 2208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Store: 2210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.Store.src); 2211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.Store.dst); 2212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LoadL: 2214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.LoadL.src); 2215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.LoadL.dst); 2216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_StoreC: 2218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.StoreC.src); 2219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.StoreC.dst); 2220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_RdWrLR: 2222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.RdWrLR.gpr); 2223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpLdSt: 2225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.sz == 4) { 2226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpLdSt.reg); 2227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.FpLdSt.addr); 2228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (i->Min.FpLdSt.sz == 8) { 2230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.FpLdSt.reg); 2231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapRegs_MIPSAMode(m, i->Min.FpLdSt.addr); 2232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpUnary: 2236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.FpUnary.dst); 2237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.FpUnary.src); 2238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpBinary: 2240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpBinary.dst); 2241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpBinary.srcL); 2242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpBinary.srcR); 2243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_FpTernary: 2245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.FpTernary.dst); 2246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.FpTernary.src1); 2247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.FpTernary.src2); 2248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.FpTernary.src3); 2249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpConvert: 2251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpConvert.dst); 2252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpConvert.src); 2253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpCompare: 2255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpCompare.dst); 2256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpCompare.srcL); 2257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.FpCompare.srcR); 2258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MtFCSR: 2260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MtFCSR.src); 2261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MfFCSR: 2263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapReg(m, &i->Min.MfFCSR.dst); 2264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_FpGpMove: 2266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.FpGpMove.dst); 2267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.FpGpMove.src); 2268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return; 2269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_MoveCond: 2270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.MoveCond.dst); 2271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.MoveCond.src); 2272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mapReg(m, &i->Min.MoveCond.cond); 2273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_EvCheck: 2275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We expect both amodes only to mention %ebp, so this is in 2276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fact pointless, since %ebp isn't allocatable, but anyway.. */ 2277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.EvCheck.amCounter); 2278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mapRegs_MIPSAMode(m, i->Min.EvCheck.amFailAddr); 2279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_ProfInc: 2281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* does not use any registers. */ 2282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 2283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSInstr(i, mode64); 2285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("mapRegs_MIPSInstr"); 2286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Figure out if i represents a reg-reg move, and if so assign the 2292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng source and destination to *src and *dst. If in doubt say No. Used 2293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov by the register allocator to do move coalescing. 2294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/ 2295663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengBool isMove_MIPSInstr(MIPSInstr * i, HReg * src, HReg * dst) 2296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Moves between integer regs */ 2298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->tag == Min_Alu) { 2299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* or Rd,Rs,Rs == mr Rd,Rs */ 2300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Alu.op != Malu_OR) 2301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return False; 2302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.Alu.srcR->tag != Mrh_Reg) 2303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return False; 2304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (hregNumber(i->Min.Alu.srcR->Mrh.Reg.reg) 2305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov != hregNumber(i->Min.Alu.srcL)) 2306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return False; 2307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *src = i->Min.Alu.srcL; 2308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *dst = i->Min.Alu.dst; 2309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return True; 2310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return False; 2312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate mips spill/reload instructions under the direction of the 2315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov register allocator. */ 2316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid genSpill_MIPS( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2, HReg rreg, 2317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int offsetB, Bool mode64) 2318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am; 2320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(offsetB >= 0); 2321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(rreg)); 2322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = *i2 = NULL; 2323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am = MIPSAMode_IR(offsetB, GuestStatePointer(mode64)); 2324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (hregClass(rreg)) { 2326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcInt64: 2327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 2328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_Store(8, am, rreg, mode64); 2329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcInt32: 2331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!mode64); 2332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_Store(4, am, rreg, mode64); 2333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt32: 2335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!mode64); 2336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(False /*Store */ , 4, rreg, am); 2337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt64: 2339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(False /*Store */ , 8, rreg, am); 2340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegClass(hregClass(rreg)); 2343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("genSpill_MIPS: unimplemented regclass"); 2344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid genReload_MIPS( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2, HReg rreg, 2349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int offsetB, Bool mode64) 2350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am; 2352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(rreg)); 2353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng am = MIPSAMode_IR(offsetB, GuestStatePointer(mode64)); 2354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (hregClass(rreg)) { 2356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcInt64: 2357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 2358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_Load(8, rreg, am, mode64); 2359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcInt32: 2361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!mode64); 2362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_Load(4, rreg, am, mode64); 2363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt32: 2365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) 2366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(True /*Load */ , 8, rreg, am); 2367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(True /*Load */ , 4, rreg, am); 2369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case HRcFlt64: 2371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *i1 = MIPSInstr_FpLdSt(True /*Load */ , 8, rreg, am); 2372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppHRegClass(hregClass(rreg)); 2375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("genReload_MIPS: unimplemented regclass"); 2376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------- The mips assembler --------- */ 2381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt iregNo(HReg r, Bool mode64) 2383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n; 2385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(hregClass(r) == (mode64 ? HRcInt64 : HRcInt32)); 2386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(r)); 2387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng n = hregNumber(r); 2388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n <= 32); 2389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return n; 2390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar fregNo(HReg r, Bool mode64) 2393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n; 2395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(r)); 2396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng n = hregNumber(r); 2397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n <= 31); 2398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return n; 2399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar dregNo(HReg r) 2402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n; 2404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!hregIsVirtual(r)); 2405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng n = hregNumber(r); 2406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n <= 31); 2407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return n; 2408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Emit 32bit instruction */ 2411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *emit32(UChar * p, UInt w32) 2412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL) 2414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar(w32 & 0x000000FF); 2415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 8) & 0x000000FF); 2416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 16) & 0x000000FF); 2417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 24) & 0x000000FF); 2418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB) 2419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 24) & 0x000000FF); 2420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 16) & 0x000000FF); 2421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar((w32 >> 8) & 0x000000FF); 2422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *p++ = toUChar(w32 & 0x000000FF); 2423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 2424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Fetch an instruction */ 2427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt fetch32 ( UChar* p ) 2428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt w32 = 0; 2430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL) 2431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[0]) << 0); 2432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[1]) << 8); 2433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[2]) << 16); 2434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[3]) << 24); 2435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB) 2436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[0]) << 24); 2437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[1]) << 16); 2438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[2]) << 8); 2439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng w32 |= ((0xFF & (UInt)p[3]) << 0); 2440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 2441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return w32; 2442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* physical structure of mips instructions */ 2445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* type I : opcode - 6 bits 2446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rs - 5 bits 2447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rt - 5 bits 2448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng immediate - 16 bits 2449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/ 2450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkFormI(UChar * p, UInt opc, UInt rs, UInt rt, UInt imm) 2451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 2453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc < 0x40); 2454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rs < 0x20); 2455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rt < 0x20); 2456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = imm & 0xFFFF; 2457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc << 26) | (rs << 21) | (rt << 16) | (imm)); 2458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 2459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* type R: opcode - 6 bits 2462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rs - 5 bits 2463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rt - 5 bits 2464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rd - 5 bits 2465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sa - 5 bits 2466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng func - 6 bits 2467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/ 2468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkFormR(UChar * p, UInt opc, UInt rs, UInt rt, UInt rd, UInt sa, 2469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt func) 2470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rs >= 0x20) 2472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("rs = %d\n", rs); 2473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 2474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc < 0x40); 2475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rs < 0x20); 2476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rt < 0x20); 2477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rd < 0x20); 2478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sa < 0x20); 2479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng func = func & 0xFFFF; 2480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc << 26) | (rs << 21) | (rt << 16) | (rd << 11) | (sa << 6) | 2481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (func)); 2482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 2484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkFormS(UChar * p, UInt opc1, UInt rRD, UInt rRS, UInt rRT, 2487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt sa, UInt opc2) 2488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt theInstr; 2490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc1 <= 0x3F); 2491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rRD < 0x20); 2492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rRS < 0x20); 2493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(rRT < 0x20); 2494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(opc2 <= 0x3F); 2495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sa >= 0 && sa <= 0x3F); 2496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng theInstr = ((opc1 << 26) | (rRS << 21) | (rRT << 16) | (rRD << 11) | 2498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ((sa & 0x1F) << 6) | (opc2)); 2499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return emit32(p, theInstr); 2501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *doAMode_IR(UChar * p, UInt opc1, UInt rSD, MIPSAMode * am, 2504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64) 2505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt rA, idx, r_dst; 2507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(am->tag == Mam_IR); 2508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(am->Mam.IR.index < 0x10000); 2509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rA = iregNo(am->Mam.IR.base, mode64); 2511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng idx = am->Mam.IR.index; 2512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33 || rSD == 34) 2514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_dst = 24; 2515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_dst = rSD; 2517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (opc1 < 40) { 2519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* load */ 2520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33) 2521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mfhi */ 2522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 16); 2523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (rSD == 34) 2524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mflo */ 2525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 18); 2526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, opc1, rA, r_dst, idx); 2529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (opc1 >= 40) { 2531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* store */ 2532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33) 2533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mthi */ 2534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_dst, 0, 0, 0, 17); 2535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (rSD == 34) 2536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtlo */ 2537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_dst, 0, 0, 0, 19); 2538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *doAMode_RR(UChar * p, UInt opc1, UInt rSD, MIPSAMode * am, 2544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64) 2545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt rA, rB, r_dst; 2547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(am->tag == Mam_RR); 2548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rA = iregNo(am->Mam.RR.base, mode64); 2550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng rB = iregNo(am->Mam.RR.index, mode64); 2551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33 || rSD == 34) 2553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_dst = 24; 2554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r_dst = rSD; 2556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (opc1 < 40) { 2558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* load */ 2559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33) 2560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mfhi */ 2561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 16); 2562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (rSD == 34) 2563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mflo */ 2564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 18); 2565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 2568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* daddu rA, rA, rB$ 2569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sd/ld r_dst, 0(rA)$ 2570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov dsubu rA, rA, rB */ 2571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, rA, rB, rA, 0, 45); 2572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, opc1, rA, r_dst, 0); 2573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, rA, rB, rA, 0, 47); 2574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* addu rA, rA, rB 2576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sw/lw r_dst, 0(rA) 2577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov subu rA, rA, rB */ 2578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, rA, rB, rA, 0, 33); 2579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, opc1, rA, r_dst, 0); 2580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, rA, rB, rA, 0, 35); 2581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (opc1 >= 40) { 2583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* store */ 2584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (rSD == 33) 2585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mthi */ 2586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_dst, 0, 0, 0, 17); 2587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (rSD == 34) 2588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mtlo */ 2589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_dst, 0, 0, 0, 19); 2590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Load imm to r_dst */ 2596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkLoadImm(UChar * p, UInt r_dst, ULong imm, Bool mode64) 2597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 2600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt) imm; 2601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int) u32; 2602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long) s32; 2603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong) s64; 2604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (imm >= 0xFFFFFFFFFFFF8000ULL || imm < 0x8000) { 2607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sign-extendable from 16 bits 2608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addiu r_dst, 0, imm => li r_dst, imm */ 2609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 0, r_dst, imm & 0xFFFF); 2610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (imm >= 0xFFFFFFFF80000000ULL || imm < 0x80000000ULL) { 2612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sign-extendable from 32 bits 2613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addiu r_dst, r0, (imm >> 16) => lis r_dst, (imm >> 16) 2614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov lui r_dst, (imm >> 16) */ 2615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 15, 0, r_dst, (imm >> 16) & 0xFFFF); 2616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori r_dst, r_dst, (imm & 0xFFFF) */ 2617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 2620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lui load in upper half of low word */ 2621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 15, 0, r_dst, (imm >> 48) & 0xFFFF); 2622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori */ 2623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, (imm >> 32) & 0xFFFF); 2624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* shift */ 2625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_dst, 16, 56); 2626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori */ 2627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, (imm >> 16) & 0xFFFF); 2628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* shift */ 2629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_dst, 16, 56); 2630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori */ 2631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* A simplified version of mkLoadImm that always generates 2 or 6 2638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instructions (32 or 64 bits respectively) even if it could generate 2639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fewer. This is needed for generating fixed sized patchable 2640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sequences. */ 2641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UChar* mkLoadImm_EXACTLY2or6 ( UChar* p, 2642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt r_dst, ULong imm, Bool mode64) 2643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 2645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* In 32-bit mode, make sure the top 32 bits of imm are a sign 2648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov extension of the bottom 32 bits. (Probably unnecessary.) */ 2649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt)imm; 2650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int)u32; 2651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long)s32; 2652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong)s64; 2653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sign-extendable from 32 bits 2657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addiu r_dst, r0, (imm >> 16) => lis r_dst, (imm >> 16) 2658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov lui r_dst, (imm >> 16) */ 2659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 15, 0, r_dst, (imm >> 16) & 0xFFFF); 2660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori r_dst, r_dst, (imm & 0xFFFF) */ 2661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* full 64bit immediate load: 6 (six!) insns. */ 2664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(mode64); 2665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lui load in upper half of low word */ 2666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 15, 0, r_dst, (imm >> 48) & 0xFFFF); 2667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori */ 2668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 13, r_dst, r_dst, (imm >> 32) & 0xFFFF); 2669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* shift */ 2670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormS(p, 0, r_dst, 0, r_dst, 16, 56); 2671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori */ 2672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 13, r_dst, r_dst, (imm >> 16) & 0xFFFF); 2673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* shift */ 2674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormS(p, 0, r_dst, 0, r_dst, 16, 56); 2675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori */ 2676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Checks whether the sequence of bytes at p was indeed created 2682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov by mkLoadImm_EXACTLY2or6 with the given parameters. */ 2683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool isLoadImm_EXACTLY2or6 ( UChar* p_to_check, 2684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst, ULong imm, Bool mode64 ) 2685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 2687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool ret; 2688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* In 32-bit mode, make sure the top 32 bits of imm are a sign 2690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng extension of the bottom 32 bits. (Probably unnecessary.) */ 2691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt u32 = (UInt)imm; 2692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int s32 = (Int)u32; 2693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Long s64 = (Long)s32; 2694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imm = (ULong)s64; 2695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) { 2698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt expect[2] = { 0, 0 }; 2699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)&expect[0]; 2700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lui r_dst, (immi >> 16) */ 2701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 15, 0, r_dst, (imm >> 16) & 0xFFFF); 2702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori r_dst, r_dst, (imm & 0xFFFF) */ 2703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(p == (UChar*)&expect[2]); 2705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ret = fetch32(p_to_check + 0) == expect[0] 2707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && fetch32(p_to_check + 4) == expect[1]; 2708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt expect[6] = { 0, 0, 0, 0, 0, 0}; 2710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UChar* p = (UChar*)&expect[0]; 2711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lui load in upper half of low word */ 2712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 15, 0, r_dst, (imm >> 48) & 0xFFFF); 2713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori */ 2714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 13, r_dst, r_dst, (imm >> 32) & 0xFFFF); 2715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* shift */ 2716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormS(p, 0, r_dst, 0, r_dst, 16, 56); 2717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori */ 2718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 13, r_dst, r_dst, (imm >> 16) & 0xFFFF); 2719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* shift */ 2720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormS(p, 0, r_dst, 0, r_dst, 16, 56); 2721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ori */ 2722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 13, r_dst, r_dst, imm & 0xFFFF); 2723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(p == (UChar*)&expect[6]); 2724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ret = fetch32(p_to_check + 0) == expect[0] 2726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && fetch32(p_to_check + 4) == expect[1] 2727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && fetch32(p_to_check + 8) == expect[2] 2728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && fetch32(p_to_check + 12) == expect[3] 2729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && fetch32(p_to_check + 16) == expect[4] 2730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && fetch32(p_to_check + 20) == expect[5]; 2731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return ret; 2733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a machine-word sized load or store. Simplified version of 2736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov the Min_Load and Min_Store cases below. 2737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov This will generate 32-bit load/store on MIPS32, and 64-bit load/store on 2738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov MIPS64 platforms. 2739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/ 2740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UChar* do_load_or_store_machine_word ( UChar* p, Bool isLoad, UInt reg, 2741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov MIPSAMode* am, Bool mode64 ) 2742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (isLoad) { /* load */ 2744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 2745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 2746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 2747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Mam.IR.index & 3)); 2748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = doAMode_IR(p, mode64 ? 55 : 35, reg, am, mode64); 2750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 2752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 2753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 2754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else /* store */ { 2761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (am->tag) { 2762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_IR: 2763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 2764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am->Mam.IR.index & 3)); 2765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = doAMode_IR(p, mode64 ? 63 : 43, reg, am, mode64); 2767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 2768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mam_RR: 2769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* we could handle this case, but we don't expect to ever 2770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov need to. */ 2771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 2772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 2773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 2774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 2775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 2776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return p; 2779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 2780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Generate a 32-bit sized load or store. Simplified version of 2782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_load_or_store_machine_word above. */ 2783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UChar* do_load_or_store_word32 ( UChar* p, Bool isLoad, UInt reg, 2784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov MIPSAMode* am, Bool mode64 ) 2785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 2786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (isLoad) { /* load */ 2787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (am->tag) { 2788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mam_IR: 2789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (mode64) { 2790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (am->Mam.IR.index & 3)); 2791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = doAMode_IR(p, 35, reg, am, mode64); 2793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 2794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mam_RR: 2795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* we could handle this case, but we don't expect to ever 2796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov need to. */ 2797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 2798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 2799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 2800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0); 2801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 2802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else /* store */ { 2804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (am->tag) { 2805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mam_IR: 2806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (mode64) { 2807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(0 == (am->Mam.IR.index & 3)); 2808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = doAMode_IR(p, 43, reg, am, mode64); 2810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mam_RR: 2812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* we could handle this case, but we don't expect to ever 2813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng need to. */ 2814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0); 2818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Move r_dst to r_src */ 2825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *mkMoveReg(UChar * p, UInt r_dst, UInt r_src) 2826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_dst < 0x20); 2828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(r_src < 0x20); 2829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (r_dst != r_src) { 2831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* or r_dst, r_src, r_src */ 2832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_src, r_src, r_dst, 0, 37); 2833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p; 2835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 2836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Emit an instruction into buf and return the number of bytes used. 2838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Note that buf is not the insn's final place, and therefore it is 2839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng imperative to emit position-independent code. If the emitted 2840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng instruction was a profiler inc, set *is_profInc to True, else 2841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng leave it unchanged. */ 2842663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt emit_MIPSInstr ( /*MB_MOD*/Bool* is_profInc, 2843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UChar* buf, Int nbuf, MIPSInstr* i, 2844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64, 2845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_slowEP, 2846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_to_fastEP, 2847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xindir, 2848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_xassisted ) 2849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 2850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar *p = &buf[0]; 2851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar *ptmp = p; 2852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(nbuf >= 32); 2853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->tag) { 2855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LI: 2856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, iregNo(i->Min.LI.dst, mode64), i->Min.LI.imm, mode64); 2857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 2858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Alu: { 2860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *srcR = i->Min.Alu.srcR; 2861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool immR = toBool(srcR->tag == Mrh_Imm); 2862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Alu.dst, mode64); 2863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Alu.srcL, mode64); 2864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt r_srcR = immR ? (-1) /*bogus */ : iregNo(srcR->Mrh.Reg.reg, 2865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mode64); 2866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Alu.op) { 2867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Malu_ADD, Malu_SUB, Malu_AND, Malu_OR, Malu_NOR, Malu_XOR, Malu_SLT */ 2868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_ADD: 2869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(srcR->Mrh.Imm.imm16 != 0x8000); 2871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (srcR->Mrh.Imm.syned) 2872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addi */ 2873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addiu */ 2876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addu */ 2879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 33); 2880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_SUB: 2883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addi , but with negated imm */ 2885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(srcR->Mrh.Imm.syned); 2886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(srcR->Mrh.Imm.imm16 != 0x8000); 2887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 8, r_srcL, r_dst, (-srcR->Mrh.Imm.imm16)); 2888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* subu */ 2890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 35); 2891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_AND: 2894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* andi */ 2896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!srcR->Mrh.Imm.syned); 2897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 12, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* and */ 2900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 36); 2901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_OR: 2904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ori */ 2906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!srcR->Mrh.Imm.syned); 2907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 13, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* or */ 2910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (r_srcL == 33) 2911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* MFHI */ 2912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 16); 2913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (r_srcL == 34) 2914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* MFLO */ 2915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 18); 2916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (r_dst == 33) 2917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* MTHI */ 2918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, 0, 0, 0, 17); 2919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (r_dst == 34) 2920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* MTLO */ 2921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, 0, 0, 0, 19); 2922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 2923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 37); 2924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_NOR: 2927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nor */ 2928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!immR); 2929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 39); 2930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Malu_XOR: 2932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* xori */ 2934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!srcR->Mrh.Imm.syned); 2935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 14, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* xor */ 2938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 38); 2939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 2941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Malu_DADD: 2942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (immR) { 2943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(srcR->Mrh.Imm.syned); 2944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(srcR->Mrh.Imm.imm16 != 0x8000); 2945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 25, r_srcL, r_dst, srcR->Mrh.Imm.imm16); 2946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 45); 2948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 2950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Malu_DSUB: 2951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (immR) { 2952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 25, r_srcL, r_dst, (-srcR->Mrh.Imm.imm16)); 2953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 47); 2955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 2957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Malu_SLT: 2958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (immR) { 2959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 2960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 2961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 42); 2962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 2963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 2964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 2966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 2967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 2969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Shft: { 2972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSRH *srcR = i->Min.Shft.srcR; 2973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool sz32 = i->Min.Shft.sz32; 2974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool immR = toBool(srcR->tag == Mrh_Imm); 2975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Shft.dst, mode64); 2976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Shft.srcL, mode64); 2977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = immR ? (-1) /*bogus */ : iregNo(srcR->Mrh.Reg.reg, 2978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64); 2979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!mode64) 2980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz32); 2981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Shft.op) { 2982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SLL: 2983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 2984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 2986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(n >= 0 && n <= 32); 2987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 0); 2988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* shift variable */ 2990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 4); 2991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 2992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 2994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 2995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert((n >= 0 && n < 32) || (n > 31 && n < 64)); 2996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (n >= 0 && n < 32) { 2997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 56); 2998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 2999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n - 32, 60); 3000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 20); 3003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SRL: 3008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 3009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* SRL, SRLV */ 3010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 3011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 3012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n >= 0 && n < 32); 3013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 2); 3014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* shift variable */ 3016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 6); 3017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* DSRL, DSRL32, DSRLV */ 3020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 3021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 3022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert((n >= 0 && n < 32) || (n > 31 && n < 64)); 3023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (n >= 0 && n < 32) { 3024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 58); 3025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n - 32, 62); 3027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 22); 3030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mshft_SRA: 3035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 3036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* SRA, SRAV */ 3037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 3038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 3039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(n >= 0 && n < 32); 3040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 3); 3041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* shift variable */ 3043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 7); 3044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* DSRA, DSRA32, DSRAV */ 3047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (immR) { 3048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt n = srcR->Mrh.Imm.imm16; 3049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert((n >= 0 && n < 32) || (n > 31 && n < 64)); 3050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (n >= 0 && n < 32) { 3051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n, 59); 3052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, 0, r_srcL, n - 32, 63); 3054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormS(p, 0, r_dst, r_srcR, r_srcL, 0, 23); 3057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Unary: { 3069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Unary.dst, mode64); 3070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.Unary.src, mode64); 3071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Unary.op) { 3073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Mun_CLO, Mun_CLZ, Mun_NOP, Mun_DCLO, Mun_DCLZ */ 3074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mun_CLO: /* clo */ 3075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 28, r_src, r_dst , r_dst, 0, 33); 3076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mun_CLZ: /* clz */ 3078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 28, r_src, r_dst , r_dst, 0, 32); 3079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mun_NOP: /* nop (sll r0,r0,0) */ 3081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, 0, 0, 0); 3082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mun_DCLO: /* clo */ 3084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 28, r_src, r_dst , r_dst, 0, 37); 3085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mun_DCLZ: /* clz */ 3087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 28, r_src, r_dst , r_dst, 0, 36); 3088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Cmp: { 3094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Cmp.srcL, mode64); 3095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = iregNo(i->Min.Cmp.srcR, mode64); 3096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Cmp.dst, mode64); 3097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Cmp.cond) { 3099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_EQ: 3100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* xor r_dst, r_srcL, r_srcR 3101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sltiu r_dst, r_dst, 1 */ 3102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 38); 3103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 11, r_dst, r_dst, 1); 3104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_NE: 3106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* xor r_dst, r_srcL, r_srcR 3107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sltu r_dst, zero, r_dst */ 3108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 38); 3109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 0, r_dst, r_dst, 0, 43); 3110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LT: 3112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* slt r_dst, r_srcL, r_srcR */ 3113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 42); 3114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LO: 3116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sltu r_dst, r_srcL, r_srcR */ 3117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 43); 3118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LE: 3120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* slt r_dst, r_srcR, r_srcL 3121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov xori r_dst, r_dst, 1 */ 3122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, r_srcR, r_srcL, r_dst, 0, 42); 3123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 14, r_dst, r_dst, 1); 3124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case MIPScc_LS: 3126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sltu r_dst, rsrcR, r_srcL 3127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov xori r_dsr, r_dst, 1 */ 3128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, r_srcR, r_srcL, r_dst, 0, 43); 3129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 14, r_dst, r_dst, 1); 3130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mul: { 3138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool syned = i->Min.Mul.syned; 3139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool widening = i->Min.Mul.widening; 3140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool sz32 = i->Min.Mul.sz32; 3141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Mul.srcL, mode64); 3142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = iregNo(i->Min.Mul.srcR, mode64); 3143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Mul.dst, mode64); 3144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (widening) { 3145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 3146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) 3147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mult */ 3148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 24); 3149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 3150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* multu */ 3151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 25); 3152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) /* DMULT r_dst,r_srcL,r_srcR */ 3154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 28); 3155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else /* DMULTU r_dst,r_srcL,r_srcR */ 3156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 29); 3157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) 3160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* mul */ 3161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, r_dst, 0, 2); 3162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (mode64 && !sz32) 3163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, r_dst, 0, 2); 3164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 3165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Macc: { 3171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool syned = i->Min.Macc.syned; 3172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Macc.srcL, mode64); 3173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = iregNo(i->Min.Macc.srcR, mode64); 3174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) { 3176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Macc.op) { 3177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_ADD: 3178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* madd */ 3179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, 0, 0, 0); 3180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_SUB: 3182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* msub */ 3183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, 0, 0, 3184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4); 3185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.Macc.op) { 3191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_ADD: 3192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* maddu */ 3193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, 0, 0, 3194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1); 3195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Macc_SUB: 3197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* msubu */ 3198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 28, r_srcL, r_srcR, 0, 0, 3199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5); 3200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Div: { 3210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool syned = i->Min.Div.syned; 3211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool sz32 = i->Min.Div.sz32; 3212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcL = iregNo(i->Min.Div.srcL, mode64); 3213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_srcR = iregNo(i->Min.Div.srcR, mode64); 3214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz32) { 3215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) { 3216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* div */ 3217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 26); 3218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else 3219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* divu */ 3220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 27); 3221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (syned) { 3224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ddiv */ 3225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 30); 3226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else 3227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ddivu */ 3228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_srcL, r_srcR, 0, 0, 31); 3229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mthi: { 3234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.MtHL.src, mode64); 3235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_src, 0, 0, 0, 17); 3236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mtlo: { 3240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.MtHL.src, mode64); 3241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, r_src, 0, 0, 0, 19); 3242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mfhi: { 3246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.MfHL.dst, mode64); 3247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 16); 3248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Mflo: { 3252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.MfHL.dst, mode64); 3253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 0, 0, r_dst, 0, 18); 3254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MtFCSR: { 3258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.MtFCSR.src, mode64); 3259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* ctc1 */ 3260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 17, 6, r_src, 31, 0, 0); 3261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_MfFCSR: { 3265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.MfFCSR.dst, mode64); 3266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* cfc1 */ 3267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 17, 2, r_dst, 31, 0, 0); 3268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Call: { 3272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->Min.Call.cond != MIPScc_AL 3273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov && i->Min.Call.rloc.pri != RLPri_None) { 3274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* The call might not happen (it isn't unconditional) and 3275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov it returns a result. In this case we will need to 3276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov generate a control flow diamond to put 0x555..555 in 3277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov the return register(s) in the case where the call 3278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov doesn't happen. If this ever becomes necessary, maybe 3279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov copy code from the ARM equivalent. Until that day, 3280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov just give up. */ 3281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 3282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSCondCode cond = i->Min.Call.cond; 3284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt r_dst = 25; /* using %r25 as address temporary - 3285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov see getRegUsage_MIPSInstr */ 3286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jump over the following insns if condition does not hold */ 3288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (cond != MIPScc_AL) { 3289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jmp fwds if !condition */ 3290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* don't know how many bytes to jump over yet... 3291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng make space for a jump instruction + nop!!! and fill in later. */ 3292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ptmp = p; /* fill in this bit later */ 3293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p += 8; /* p += 8 */ 3294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (!mode64) { 3297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* addiu $29, $29, -16 */ 3298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 9, 29, 29, 0xFFF0); 3299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* load target to r_dst; p += 4|8 */ 3302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkLoadImm(p, r_dst, i->Min.Call.target, mode64); 3303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* jalr r_dst */ 3305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, r_dst, 0, 31, 0, 9); /* p += 4 */ 3306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 0, 0, 0, 0, 0); /* p += 4 */ 3307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (!mode64) { 3309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* addiu $29, $29, 16 */ 3310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 9, 29, 29, 0x0010); 3311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 3314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (cond != MIPScc_AL) { 3315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.Call.src, mode64); 3316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 3317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta >= 20 && delta <= 32); 3319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* blez r_src, delta/4-1 3320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov nop */ 3321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 6, r_src, 0, delta / 4 - 1); 3322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mkFormR(ptmp, 0, 0, 0, 0, 0, 0); 3323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XDirect: { 3328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* NB: what goes on here has to be very closely coordinated 3329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng with the chainXDirect_MIPS and unchainXDirect_MIPS below. */ 3330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We're generating chain-me requests here, so we need to be 3331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sure this is actually allowed -- no-redir translations 3332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng can't use chain-me's. Hence: */ 3333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_chain_me_to_slowEP != NULL); 3334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_chain_me_to_fastEP != NULL); 3335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Use ptmp for backpatching conditional jumps. */ 3337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = NULL; 3338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional 3340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jump over the rest of it. Or at least, leave a space for 3341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng it that we will shortly fill in. */ 3342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XDirect.cond != MIPScc_AL) { 3343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Min.XDirect.cond != MIPScc_NV); 3344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 3345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 12; 3346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest PC. */ 3349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* move r9, dstGA */ 3350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sw/sd r9, amPC */ 3351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/ 9, (ULong)i->Min.XDirect.dstGA, 3352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mode64); 3353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store_machine_word(p, False /*!isLoad*/ , /*r*/ 9, 3354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov i->Min.XDirect.amPC, mode64); 3355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* --- FIRST PATCHABLE BYTE follows --- */ 3357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* VG_(disp_cp_chain_me_to_{slowEP,fastEP}) (where we're 3358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng calling to) backs up the return address, so as to find the 3359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng address of the first patchable byte. So: don't change the 3360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng number of instructions (3) below. */ 3361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* move r9, VG_(disp_cp_chain_me_to_{slowEP,fastEP}) */ 3362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jr r9 */ 3363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me 3364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov = i->Min.XDirect.toFastEP ? disp_cp_chain_me_to_fastEP 3365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : disp_cp_chain_me_to_slowEP; 3366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/ 9, 3367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(disp_cp_chain_me), mode64); 3368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jalr $9 */ 3369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nop */ 3370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 9, 0, 31, 0, 9); /* p += 4 */ 3371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 0, 0, 0, 0, 0); /* p += 4 */ 3372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* --- END of PATCHABLE BYTES --- */ 3373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 3375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XDirect.cond != MIPScc_AL) { 3376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 3377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng delta = delta / 4 - 3; 3378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta > 0 && delta < 40); 3379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lw $9, COND_OFFSET(GuestSP) 3381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng beq $9, $0, 2 3382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov nop */ 3383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ptmp = mkFormI(ptmp, 35, GuestSP, 9, COND_OFFSET(mode64)); 3384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 4, 0, 9, (delta)); 3385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mkFormR(ptmp, 0, 0, 0, 0, 0, 0); 3386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XIndir: { 3391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We're generating transfers that could lead indirectly to a 3392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng chain-me, so we need to be sure this is actually allowed -- 3393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng no-redir translations are not allowed to reach normal 3394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng translations without going through the scheduler. That means 3395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng no XDirects or XIndirs out from no-redir translations. 3396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Hence: */ 3397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(disp_cp_xindir != NULL); 3398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Use ptmp for backpatching conditional jumps. */ 3400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = NULL; 3401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional 3403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jump over the rest of it. */ 3404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XIndir.cond != MIPScc_AL) { 3405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Min.XIndir.cond != MIPScc_NV); 3406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 3407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 12; 3408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest PC. */ 3411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sw/sd r-dstGA, amPC */ 3412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store_machine_word(p, False /*!isLoad*/ , 3413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng iregNo(i->Min.XIndir.dstGA, mode64), 3414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.amPC, mode64); 3415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* move r9, VG_(disp_cp_xindir) */ 3417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jalr r9 */ 3418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nop */ 3419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/ 9, 3420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Ptr_to_ULong(disp_cp_xindir), mode64); 3421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 9, 0, 31, 0, 9); /* p += 4 */ 3422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 0, 0, 0, 0, 0); /* p += 4 */ 3423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 3425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XIndir.cond != MIPScc_AL) { 3426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 3427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng delta = delta / 4 - 3; 3428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta > 0 && delta < 40); 3429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lw $9, COND_OFFSET($GuestSP) 3431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng beq $9, $0, 2 3432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov nop */ 3433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ptmp = mkFormI(ptmp, 35, GuestSP, 9, COND_OFFSET(mode64)); 3434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 4, 0, 9, (delta)); 3435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mkFormR(ptmp, 0, 0, 0, 0, 0, 0); 3436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_XAssisted: { 3441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* First off, if this is conditional, create a conditional jump 3442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng over the rest of it. Or at least, leave a space for it that 3443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we will shortly fill in. */ 3444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = NULL; 3445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XAssisted.cond != MIPScc_AL) { 3446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(i->Min.XAssisted.cond != MIPScc_NV); 3447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = p; 3448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p += 12; 3449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Update the guest PC. */ 3452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sw/sd r-dstGA, amPC */ 3453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store_machine_word(p, False /*!isLoad*/ , 3454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng iregNo(i->Min.XIndir.dstGA, mode64), 3455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.XIndir.amPC, mode64); 3456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* imm32/64 r31, $magic_number */ 3458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt trcval = 0; 3459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.XAssisted.jk) { 3460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_ClientReq: trcval = VEX_TRC_JMP_CLIENTREQ; break; 3461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break; 3462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* case Ijk_Sys_int128: trcval = VEX_TRC_JMP_SYS_INT128; break; 3463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_Yield: trcval = VEX_TRC_JMP_YIELD; break; */ 3464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_EmWarn: trcval = VEX_TRC_JMP_EMWARN; break; 3465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_EmFail: trcval = VEX_TRC_JMP_EMFAIL; break; 3466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* case Ijk_MapFail: trcval = VEX_TRC_JMP_MAPFAIL; break; */ 3467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_NoDecode: trcval = VEX_TRC_JMP_NODECODE; break; 3468eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov case Ijk_InvalICache: trcval = VEX_TRC_JMP_INVALICACHE; break; 3469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_NoRedir: trcval = VEX_TRC_JMP_NOREDIR; break; 3470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_SigILL: trcval = VEX_TRC_JMP_SIGILL; break; 3471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_SigTRAP: trcval = VEX_TRC_JMP_SIGTRAP; break; 3472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* case Ijk_SigSEGV: trcval = VEX_TRC_JMP_SIGSEGV; break; */ 3473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_SigBUS: trcval = VEX_TRC_JMP_SIGBUS; break; 3474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_SigFPE_IntDiv: trcval = VEX_TRC_JMP_SIGFPE_INTDIV; break; 3475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_SigFPE_IntOvf: trcval = VEX_TRC_JMP_SIGFPE_INTOVF; break; 3476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_Boring: trcval = VEX_TRC_JMP_BORING; break; 3477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* We don't expect to see the following being assisted. 3478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_Ret: 3479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Ijk_Call: 3480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fallthrough */ 3481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 3482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppIRJumpKind(i->Min.XAssisted.jk); 3483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("emit_MIPSInstr.Min_XAssisted: unexpected jump kind"); 3484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(trcval != 0); 3486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/ GuestSP, trcval, mode64); 3487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* move r9, VG_(disp_cp_xassisted) */ 3489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/ 9, 3490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (ULong)Ptr_to_ULong(disp_cp_xassisted), mode64); 3491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jalr $9 3492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop */ 3493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 9, 0, 31, 0, 9); /* p += 4 */ 3494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 0, 0, 0, 0, 0); /* p += 4 */ 3495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Fix up the conditional jump, if there was one. */ 3497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.XAssisted.cond != MIPScc_AL) { 3498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int delta = p - ptmp; 3499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng delta = delta / 4 - 3; 3500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(delta > 0 && delta < 40); 3501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lw $9, COND_OFFSET($GuestSP) 3503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng beq $9, $0, 2 3504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov nop */ 3505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ptmp = mkFormI(ptmp, 35, GuestSP, 9, COND_OFFSET(mode64)); 3506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ptmp = mkFormI(ptmp, 4, 0, 9, (delta)); 3507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mkFormR(ptmp, 0, 0, 0, 0, 0, 0); 3508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Load: { 3513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.Load.src; 3514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) { 3515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Load.dst, mode64); 3516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc, sz = i->Min.Load.sz; 3517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64 && (sz == 4 || sz == 8)) { 3518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* should be guaranteed to us by iselWordExpr_AMode */ 3519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am_addr->Mam.IR.index & 3)); 3520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 3523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 32; 3524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 3526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 33; 3527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 3529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 35; 3530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 3532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 55; 3533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 3534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc, r_dst, am_addr, mode64); 3540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (am_addr->tag == Mam_RR) { 3542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.Load.dst, mode64); 3543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc, sz = i->Min.Load.sz; 3544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 3547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 32; 3548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 3550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 33; 3551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 3553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 35; 3554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 3556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 55; 3557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 3558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, opc, r_dst, am_addr, mode64); 3564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_Store: { 3570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.Store.dst; 3571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) { 3572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.Store.src, mode64); 3573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc, sz = i->Min.Store.sz; 3574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64 && (sz == 4 || sz == 8)) { 3575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* should be guaranteed to us by iselWordExpr_AMode */ 3576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (am_addr->Mam.IR.index & 3)); 3577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 3580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 40; 3581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 3583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 41; 3584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 3586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 43; 3587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 3589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 3590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 63; 3591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, opc, r_src, am_addr, mode64); 3597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (am_addr->tag == Mam_RR) { 3599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.Store.src, mode64); 3600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt opc, sz = i->Min.Store.sz; 3601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (sz) { 3603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 3604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 40; 3605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 3607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 41; 3608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 4: 3610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 43; 3611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 8: 3613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(mode64); 3614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng opc = 63; 3615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, opc, r_src, am_addr, mode64); 3621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_LoadL: { 3626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.LoadL.src; 3627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(am_addr->Mam.IR.base, mode64); 3628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt idx = am_addr->Mam.IR.index; 3629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(i->Min.LoadL.dst, mode64); 3630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->Min.LoadL.sz == 4) 3632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 0x30, r_src, r_dst, idx); 3633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 3634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 0x34, r_src, r_dst, idx); 3635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_StoreC: { 3638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.StoreC.dst; 3639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_src = iregNo(i->Min.StoreC.src, mode64); 3640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt idx = am_addr->Mam.IR.index; 3641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt r_dst = iregNo(am_addr->Mam.IR.base, mode64); 3642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (i->Min.StoreC.sz == 4) 3644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 0x38, r_dst, r_src, idx); 3645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 3646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 0x3C, r_dst, r_src, idx); 3647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_RdWrLR: { 3650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt reg = iregNo(i->Min.RdWrLR.gpr, mode64); 3651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool wrLR = i->Min.RdWrLR.wrLR; 3652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (wrLR) 3653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkMoveReg(p, 31, reg); 3654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 3655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkMoveReg(p, reg, 31); 3656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Floating point */ 3660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpLdSt: { 3661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MIPSAMode *am_addr = i->Min.FpLdSt.addr; 3662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar sz = i->Min.FpLdSt.sz; 3663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(sz == 4 || sz == 8); 3664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (sz == 4) { 3665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt f_reg = fregNo(i->Min.FpLdSt.reg, mode64); 3666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.isLoad) { 3667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) 3668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x31, f_reg, am_addr, mode64); 3669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (am_addr->tag == Mam_RR) 3670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x31, f_reg, am_addr, mode64); 3671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) 3673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_IR(p, 0x39, f_reg, am_addr, mode64); 3674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else if (am_addr->tag == Mam_RR) 3675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = doAMode_RR(p, 0x39, f_reg, am_addr, mode64); 3676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (sz == 8) { 3678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt f_reg = dregNo(i->Min.FpLdSt.reg); 3679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (i->Min.FpLdSt.isLoad) { 3680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) { 3681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = doAMode_IR(p, 0x35, f_reg, am_addr, mode64); 3682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (am_addr->tag == Mam_RR) { 3683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = doAMode_RR(p, 0x35, f_reg, am_addr, mode64); 3684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 3686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (am_addr->tag == Mam_IR) { 3687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = doAMode_IR(p, 0x3d, f_reg, am_addr, mode64); 3688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (am_addr->tag == Mam_RR) { 3689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = doAMode_RR(p, 0x3d, f_reg, am_addr, mode64); 3690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpUnary: { 3697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.FpUnary.op) { 3698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_MOVS: { /* FP move */ 3699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x6); 3702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_MOVD: { /* FP move */ 3705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x6); 3708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_ABSS: { /* ABS.S */ 3711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x5); 3714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_ABSD: { /* ABS.D */ 3717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x5); 3720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_NEGS: { /* NEG.S */ 3723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x7); 3726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_NEGD: { /* NEG.D */ 3729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x7); 3732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_SQRTS: { /* SQRT.S */ 3735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpUnary.dst, mode64); 3736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = fregNo(i->Min.FpUnary.src, mode64); 3737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x04); 3738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_SQRTD: { /* SQRT.D */ 3741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpUnary.dst); 3742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_src = dregNo(i->Min.FpUnary.src); 3743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x04); 3744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpBinary: { 3753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.FpBinary.op) { 3754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ADDS: { 3755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpBinary.dst, mode64); 3756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Min.FpBinary.srcL, mode64); 3757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Min.FpBinary.srcR, mode64); 3758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, fr_srcR, fr_srcL, fr_dst, 0); 3759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SUBS: { 3762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpBinary.dst, mode64); 3763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Min.FpBinary.srcL, mode64); 3764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Min.FpBinary.srcR, mode64); 3765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, fr_srcR, fr_srcL, fr_dst, 1); 3766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MULS: { 3769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpBinary.dst, mode64); 3770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Min.FpBinary.srcL, mode64); 3771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Min.FpBinary.srcR, mode64); 3772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, fr_srcR, fr_srcL, fr_dst, 2); 3773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_DIVS: { 3776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = fregNo(i->Min.FpBinary.dst, mode64); 3777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = fregNo(i->Min.FpBinary.srcL, mode64); 3778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = fregNo(i->Min.FpBinary.srcR, mode64); 3779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, fr_srcR, fr_srcL, fr_dst, 3); 3780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ADDD: { 3783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpBinary.dst); 3784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpBinary.srcL); 3785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpBinary.srcR); 3786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, fr_srcR, fr_srcL, fr_dst, 0); 3787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_SUBD: { 3790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpBinary.dst); 3791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpBinary.srcL); 3792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpBinary.srcR); 3793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, fr_srcR, fr_srcL, fr_dst, 1); 3794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_MULD: { 3797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpBinary.dst); 3798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpBinary.srcL); 3799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpBinary.srcR); 3800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, fr_srcR, fr_srcL, fr_dst, 2); 3801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_DIVD: { 3804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst = dregNo(i->Min.FpBinary.dst); 3805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpBinary.srcL); 3806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpBinary.srcR); 3807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, fr_srcR, fr_srcL, fr_dst, 3); 3808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_FpTernary: { 3817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->Min.FpTernary.op) { 3818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_MADDS: { 3819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_dst = fregNo(i->Min.FpTernary.dst, mode64); 3820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src1 = fregNo(i->Min.FpTernary.src1, mode64); 3821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src2 = fregNo(i->Min.FpTernary.src2, mode64); 3822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src3 = fregNo(i->Min.FpTernary.src3, mode64); 3823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x13, fr_src1, fr_src2, fr_src3, fr_dst, 0x20); 3824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_MADDD: { 3827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_dst = dregNo(i->Min.FpTernary.dst); 3828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src1 = dregNo(i->Min.FpTernary.src1); 3829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src2 = dregNo(i->Min.FpTernary.src2); 3830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src3 = dregNo(i->Min.FpTernary.src3); 3831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x13, fr_src1, fr_src2, fr_src3, fr_dst, 0x21); 3832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_MSUBS: { 3835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_dst = fregNo(i->Min.FpTernary.dst, mode64); 3836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src1 = fregNo(i->Min.FpTernary.src1, mode64); 3837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src2 = fregNo(i->Min.FpTernary.src2, mode64); 3838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src3 = fregNo(i->Min.FpTernary.src3, mode64); 3839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x13, fr_src1, fr_src2, fr_src3, fr_dst, 0x28); 3840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_MSUBD: { 3843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_dst = dregNo(i->Min.FpTernary.dst); 3844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src1 = dregNo(i->Min.FpTernary.src1); 3845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src2 = dregNo(i->Min.FpTernary.src2); 3846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt fr_src3 = dregNo(i->Min.FpTernary.src3); 3847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x13, fr_src1, fr_src2, fr_src3, fr_dst, 0x29); 3848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 3851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 3852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 3854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpConvert: { 3857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.FpConvert.op) { 3858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_dst, fr_src; 3859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTSD: 3860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x20); 3863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTSW: 3865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x14, 0, fr_src, fr_dst, 0x20); 3868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTWD: 3870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x24); 3873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTWS: 3875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x24); 3878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CVTDW: 3880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = dregNo(i->Min.FpConvert.dst); 3881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x14, 0, fr_src, fr_dst, 0x21); 3883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CVTDL: 3885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_dst = dregNo(i->Min.FpConvert.dst); 3886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_src = dregNo(i->Min.FpConvert.src); 3887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x15, 0, fr_src, fr_dst, 0x21); 3888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CVTDS: 3890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_dst = dregNo(i->Min.FpConvert.dst); 3891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_src = fregNo(i->Min.FpConvert.src, mode64); 3892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x21); 3893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CVTSL: 3895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_dst = dregNo(i->Min.FpConvert.dst); 3896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_src = fregNo(i->Min.FpConvert.src, mode64); 3897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x15, 0, fr_src, fr_dst, 0x20); 3898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CVTLS: 3900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (mode64) { 3901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_src = dregNo(i->Min.FpConvert.src); 3903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 3904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_dst = dregNo(i->Min.FpConvert.dst); 3905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_src = fregNo(i->Min.FpConvert.src, mode64); 3906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 3907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x25); 3908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CVTLD: 3910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_dst = dregNo(i->Min.FpConvert.dst); 3911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_src = dregNo(i->Min.FpConvert.src); 3912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x25); 3913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRUWS: 3915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0D); 3918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRUWD: 3920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0D); 3923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRULS: 3925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x09); 3928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_TRULD: 3930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = dregNo(i->Min.FpConvert.dst); 3931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x09); 3933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILWS: 3935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0E); 3938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILWD: 3940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0E); 3943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILLS: 3945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = dregNo(i->Min.FpConvert.dst); 3946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0A); 3948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_CEILLD: 3950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = dregNo(i->Min.FpConvert.dst); 3951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0A); 3953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ROUNDWS: 3955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0C); 3958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_ROUNDWD: 3960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0C); 3963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_ROUNDLD: 3965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_dst = dregNo(i->Min.FpConvert.dst); 3966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_src = dregNo(i->Min.FpConvert.src); 3967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x08); 3968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_FLOORWS: 3970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = fregNo(i->Min.FpConvert.src, mode64); 3972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x10, 0, fr_src, fr_dst, 0x0F); 3973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Mfp_FLOORWD: 3975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_dst = fregNo(i->Min.FpConvert.dst, mode64); 3976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fr_src = dregNo(i->Min.FpConvert.src); 3977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0F); 3978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 3979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_FLOORLD: 3980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_dst = dregNo(i->Min.FpConvert.dst); 3981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fr_src = dregNo(i->Min.FpConvert.src); 3982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x11, 0, fr_src, fr_dst, 0x0B); 3983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 3984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 3986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 3987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 3989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 3990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_FpCompare: { 3992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt r_dst = iregNo(i->Min.FpCompare.dst, mode64); 3993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcL = dregNo(i->Min.FpCompare.srcL); 3994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt fr_srcR = dregNo(i->Min.FpCompare.srcR); 3995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt op; 3997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (i->Min.FpConvert.op) { 3998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CMP_UN: 3999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov op = 1; 4000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CMP_EQ: 4002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov op = 2; 4003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CMP_LT: 4005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov op = 12; 4006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Mfp_CMP_NGT: 4008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov op = 15; 4009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* c.cond.d fr_srcL, fr_srcR 4014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov cfc1 r_dst, $31 4015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov srl r_dst, r_dst, 23 4016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov andi r_dst, r_dst, 1 */ 4017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x11, fr_srcL, fr_srcR, 0, op + 48); 4018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x2, r_dst, 31, 0, 0); 4019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormS(p, 0, r_dst, 0, r_dst, 23, 2); 4020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 12, r_dst, r_dst, 1); 4021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_FpGpMove: { 4025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->Min.FpGpMove.op) { 4026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt rt, fs; 4027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpGpMove_mfc1: { 4028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rt = iregNo(i->Min.FpGpMove.dst, mode64); 4029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fs = fregNo(i->Min.FpGpMove.src, mode64); 4030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x0, rt, fs, 0x0, 0x0); 4031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpGpMove_dmfc1: { 4034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(mode64); 4035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rt = iregNo(i->Min.FpGpMove.dst, mode64); 4036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fs = fregNo(i->Min.FpGpMove.src, mode64); 4037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x1, rt, fs, 0x0, 0x0); 4038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpGpMove_mtc1: { 4041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rt = iregNo(i->Min.FpGpMove.src, mode64); 4042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fs = fregNo(i->Min.FpGpMove.dst, mode64); 4043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x4, rt, fs, 0x0, 0x0); 4044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpGpMove_dmtc1: { 4047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(mode64); 4048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov rt = iregNo(i->Min.FpGpMove.src, mode64); 4049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fs = fregNo(i->Min.FpGpMove.dst, mode64); 4050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x5, rt, fs, 0x0, 0x0); 4051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 4052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov default: 4054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto bad; 4055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov goto done; 4057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case Min_MoveCond: { 4060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch (i->Min.MoveCond.op) { 4061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt d, s, t; 4062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpMoveCond_movns: { 4063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov d = fregNo(i->Min.MoveCond.dst, mode64); 4064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov s = fregNo(i->Min.MoveCond.src, mode64); 4065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov t = iregNo(i->Min.MoveCond.cond, mode64); 4066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x10, t, s, d, 0x13); 4067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MFpMoveCond_movnd: { 4070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov d = dregNo(i->Min.MoveCond.dst); 4071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov s = dregNo(i->Min.MoveCond.src); 4072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov t = iregNo(i->Min.MoveCond.cond, mode64); 4073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0x11, 0x11, t, s, d, 0x13); 4074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case MMoveCond_movn: { 4077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov d = iregNo(i->Min.MoveCond.dst, mode64); 4078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov s = iregNo(i->Min.MoveCond.src, mode64); 4079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov t = iregNo(i->Min.MoveCond.cond, mode64); 4080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, s, t, d, 0, 0xb); 4081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 4082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 4084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 4085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 4087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_EvCheck: { 4090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* This requires a 32-bit dec/test in 32 mode. */ 4091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* We generate: 4092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lw r9, amCounter 4093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng addiu r9, r9, -1 4094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng sw r9, amCounter 4095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bgez r9, nofail 4096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng lw r9, amFailAddr 4097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 4098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 4099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nofail: 4100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 4101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p0 = p; 4102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* lw r9, amCounter */ 4103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store_word32(p, True /*isLoad*/ , /*r*/ 9, 4104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amCounter, mode64); 4105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* addiu r9,r9,-1 */ 4106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 9, 9, 0xFFFF); 4107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* sw r30, amCounter */ 4108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store_word32(p, False /*!isLoad*/ , /*r*/ 9, 4109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amCounter, mode64); 4110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* bgez t9, nofail */ 4111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 1, 9, 1, 3); 4112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lw/ld r9, amFailAddr */ 4113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = do_load_or_store_machine_word(p, True /*isLoad*/ , /*r*/ 9, 4114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i->Min.EvCheck.amFailAddr, mode64); 4115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* jalr $9 */ 4116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 9, 0, 31, 0, 9); /* p += 4 */ 4117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormR(p, 0, 0, 0, 0, 0, 0); /* p += 4 */ 4118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* nofail: */ 4119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Crosscheck */ 4121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(evCheckSzB_MIPS() == (UChar*)p - (UChar*)p0); 4122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 4123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case Min_ProfInc: { 4126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Generate a code template to increment a memory location whose 4127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng address will be known later as an immediate value. This code 4128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng template will be patched once the memory location is known. 4129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov For now we do this with address == 0x65556555. */ 4130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (mode64) { 4131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 64-bit: 4132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov move r9, 0x6555655565556555ULL 4133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ld r8, 0(r9) 4134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov daddiu r8, r8, 1 4135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sd r8, 0(r9) */ 4136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* move r9, 0x6555655565556555ULL */ 4138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/ 9, 0x6555655565556555ULL, 4139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov True /*mode64*/); 4140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* ld r8, 0(r9) */ 4141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 55, 9, 8, 0); 4142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* daddiu r8, r8, 1 */ 4144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 25, 8, 8, 1); 4145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sd r8, 0(r9) */ 4147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkFormI(p, 63, 9, 8, 0); 4148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 4149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 32-bit: 4150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov move r9, 0x65556555 4151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov lw r8, 0(r9) 4152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addiu r8, r8, 1 # add least significant word 4153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sw r8, 0(r9) 4154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sltiu r1, r8, 1 # set carry-in bit 4155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov lw r8, 4(r9) 4156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov addu r8, r8, r1 4157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sw r8, 4(r9) */ 4158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* move r9, 0x65556555 */ 4160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/ 9, 0x65556555ULL, 4161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov False /*!mode64*/); 4162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lw r8, 0(r9) */ 4163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 35, 9, 8, 0); 4164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* addiu r8, r8, 1 # add least significant word */ 4166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 9, 8, 8, 1); 4167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sw r8, 0(r9) */ 4169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 43, 9, 8, 0); 4170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sltiu r1, r8, 1 # set carry-in bit */ 4172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 11, 8, 1, 1); 4173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* lw r8, 4(r9) */ 4175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 35, 9, 8, 4); 4176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* addu r8, r8, r1 */ 4178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormR(p, 0, 8, 1, 8, 0, 33); 4179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* sw r8, 4(r9) */ 4181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = mkFormI(p, 43, 9, 8, 4); 4182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Tell the caller .. */ 4185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(!(*is_profInc)); 4186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *is_profInc = True; 4187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto done; 4188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 4191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto bad; 4192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 4194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bad: 4196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vex_printf("\n=> "); 4197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ppMIPSInstr(i, mode64); 4198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vpanic("emit_MIPSInstr"); 4199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* NOTREACHED */ done: 4200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(p - &buf[0] <= 128); 4201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return p - &buf[0]; 4202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 4203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* How big is an event check? See case for Min_EvCheck in 4205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emit_MIPSInstr just above. That crosschecks what this returns, so 4206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng we can tell if we're inconsistent. */ 4207663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengInt evCheckSzB_MIPS ( void ) 4208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 4209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt kInstrSize = 4; 4210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 7*kInstrSize; 4211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 4212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the 4214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emitInstr case for XDirect, above. */ 4215663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange chainXDirect_MIPS ( void* place_to_chain, 4216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me_EXPECTED, 4217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to, 4218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 4219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 4220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* What we're expecting to see is: 4221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng move r9, disp_cp_chain_me_to_EXPECTED 4222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 4223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 4224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 4225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov <8 or 24 bytes generated by mkLoadImm_EXACTLY2or6> 4226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0x120F809 # jalr r9 4227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0x00000000 # nop 4228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 4229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_chain; 4230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 4231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(isLoadImm_EXACTLY2or6(p, /*r*/9, 4232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (UInt)Ptr_to_ULong(disp_cp_chain_me_EXPECTED), 4233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64)); 4234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + (mode64 ? 24 : 8) + 0) == 0x120F809); 4235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + (mode64 ? 24 : 8) + 4) == 0x00000000); 4236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* And what we want to change it to is either: 4237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng move r9, place_to_jump_to 4238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 4239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 4240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 4241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov <8 bytes generated by mkLoadImm_EXACTLY2or6> 4242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0x120F809 # jalr r9 4243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0x00000000 # nop 4244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The replacement has the same length as the original. 4246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 4247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/9, 4249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(place_to_jump_to), mode64); 4250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x120F809); 4251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x00000000); 4252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = p - (UChar*)place_to_chain; 4254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(len == (mode64 ? 32 : 16)); /* stay sane */ 4255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_chain, len}; 4256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 4257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 4258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* NB: what goes on here has to be very closely coordinated with the 4260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng emitInstr case for XDirect, above. */ 4261663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange unchainXDirect_MIPS ( void* place_to_unchain, 4262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* place_to_jump_to_EXPECTED, 4263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void* disp_cp_chain_me, 4264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool mode64 ) 4265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 4266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* What we're expecting to see is: 4267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng move r9, place_to_jump_to_EXPECTED 4268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 4269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 4270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 4271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov <8 or 24 bytes generated by mkLoadImm_EXACTLY2or6> 4272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0x120F809 # jalr r9 4273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0x00000000 # nop 4274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 4275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_unchain; 4276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 4277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(isLoadImm_EXACTLY2or6(p, /*r*/ 9, 4278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(place_to_jump_to_EXPECTED), 4279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mode64)); 4280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + (mode64 ? 24 : 8) + 0) == 0x120F809); 4281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + (mode64 ? 24 : 8) + 4) == 0x00000000); 4282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* And what we want to change it to is: 4283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng move r9, disp_cp_chain_me 4284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng jalr r9 4285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nop 4286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng viz 4287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov <8 or 24 bytes generated by mkLoadImm_EXACTLY2or6> 4288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0x120F809 # jalr r9 4289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0x00000000 # nop 4290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The replacement has the same length as the original. 4291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 4292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/ 9, 4293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(disp_cp_chain_me), mode64); 4294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x120F809); 4295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng p = emit32(p, 0x00000000); 4296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Int len = p - (UChar*)place_to_unchain; 4298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(len == (mode64 ? 32 : 16)); /* stay sane */ 4299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)place_to_unchain, len}; 4300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 4301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 4302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Patch the counter address into a profile inc point, as previously 4304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng created by the Min_ProfInc case for emit_MIPSInstr. */ 4305663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVexInvalRange patchProfInc_MIPS ( void* place_to_patch, 4306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ULong* location_of_counter, Bool mode64 ) 4307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 4308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (mode64) 4309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(sizeof(ULong*) == 8); 4310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 4311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(sizeof(ULong*) == 4); 4312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar* p = (UChar*)place_to_patch; 4313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vassert(0 == (3 & (HWord)p)); 4314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(isLoadImm_EXACTLY2or6((UChar *)p, /*r*/9, 4315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mode64 ? 0x6555655565556555ULL : 0x65556555, 4316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mode64)); 4317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (mode64) { 4319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 24 + 0) == 0xDD280000); 4320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 24 + 4) == 0x65080001); 4321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 24 + 8) == 0xFD280000); 4322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 4323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 8 + 0) == 0x8D280000); 4324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 8 + 4) == 0x25080001); 4325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 8 + 8) == 0xAD280000); 4326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 8 + 12) == 0x2d010001); 4327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 8 + 16) == 0x8d280004); 4328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 8 + 20) == 0x01014021); 4329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov vassert(fetch32(p + 8 + 24) == 0xad280004); 4330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 4331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov p = mkLoadImm_EXACTLY2or6(p, /*r*/9, 4333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Ptr_to_ULong(location_of_counter), mode64); 4334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VexInvalRange vir = {(HWord)p, 8}; 4336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return vir; 4337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 4338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---------------------------------------------------------------*/ 4341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- end host_mips_defs.c ---*/ 4342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---------------------------------------------------------------*/ 4343