1362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 2362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*---------------------------------------------------------------*/ 3362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*--- begin host_mips_defs.h ---*/ 4362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*---------------------------------------------------------------*/ 5362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 6362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* 7362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj This file is part of Valgrind, a dynamic binary instrumentation 8362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj framework. 9362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 10785952d4bf502fa756b2ac58595fd31fe0f88559sewardj Copyright (C) 2010-2015 RT-RK 11362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj mips-valgrind@rt-rk.com 12362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 13362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj This program is free software; you can redistribute it and/or 14362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj modify it under the terms of the GNU General Public License as 15362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj published by the Free Software Foundation; either version 2 of the 16362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj License, or (at your option) any later version. 17362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 18362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj This program is distributed in the hope that it will be useful, but 19362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj WITHOUT ANY WARRANTY; without even the implied warranty of 20362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj General Public License for more details. 22362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 23362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj You should have received a copy of the GNU General Public License 24362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj along with this program; if not, write to the Free Software 25362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 26362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 02111-1307, USA. 27362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 28362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj The GNU General Public License is contained in the file COPYING. 29362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj*/ 30362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 31362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#ifndef __VEX_HOST_MIPS_DEFS_H 32362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#define __VEX_HOST_MIPS_DEFS_H 33362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 3458a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "libvex_basictypes.h" 35b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#include "libvex.h" /* VexArch */ 36b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#include "host_generic_regs.h" /* HReg */ 3758a637b6675d4d68e13d18b75cea7eee2a2a91feflorian 38362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 39a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj/* --------- Registers. --------- */ 40362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 41a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define ST_IN static inline 42a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 43a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define GPR(_mode64, _enc, _ix64, _ix32) \ 44a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mkHReg(False, (_mode64) ? HRcInt64 : HRcInt32, \ 45a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj (_enc), (_mode64) ? (_ix64) : (_ix32)) 46a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 47a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define FR(_mode64, _enc, _ix64, _ix32) \ 48a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mkHReg(False, (_mode64) ? HRcFlt64 : HRcFlt32, \ 49a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj (_enc), (_mode64) ? (_ix64) : (_ix32)) 50a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 51a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#define DR(_mode64, _enc, _ix64, _ix32) \ 52a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mkHReg(False, HRcFlt64, \ 53a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj (_enc), (_mode64) ? (_ix64) : (_ix32)) 54a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 55a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR16 ( Bool mode64 ) { return GPR(mode64, 16, 0, 0); } 56a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR17 ( Bool mode64 ) { return GPR(mode64, 17, 1, 1); } 57a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR18 ( Bool mode64 ) { return GPR(mode64, 18, 2, 2); } 58a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR19 ( Bool mode64 ) { return GPR(mode64, 19, 3, 3); } 59a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR20 ( Bool mode64 ) { return GPR(mode64, 20, 4, 4); } 60a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR21 ( Bool mode64 ) { return GPR(mode64, 21, 5, 5); } 61a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR22 ( Bool mode64 ) { return GPR(mode64, 22, 6, 6); } 62a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 63a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR12 ( Bool mode64 ) { return GPR(mode64, 12, 7, 7); } 64a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR13 ( Bool mode64 ) { return GPR(mode64, 13, 8, 8); } 65a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR14 ( Bool mode64 ) { return GPR(mode64, 14, 9, 9); } 66a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR15 ( Bool mode64 ) { return GPR(mode64, 15, 10, 10); } 67a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR24 ( Bool mode64 ) { return GPR(mode64, 24, 11, 11); } 68a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 69a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_F16 ( Bool mode64 ) { return FR (mode64, 16, 12, 12); } 70a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_F18 ( Bool mode64 ) { return FR (mode64, 18, 13, 13); } 71a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_F20 ( Bool mode64 ) { return FR (mode64, 20, 14, 14); } 72a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_F22 ( Bool mode64 ) { return FR (mode64, 22, 15, 15); } 73a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_F24 ( Bool mode64 ) { return FR (mode64, 24, 16, 16); } 74a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_F26 ( Bool mode64 ) { return FR (mode64, 26, 17, 17); } 75a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_F28 ( Bool mode64 ) { return FR (mode64, 28, 18, 18); } 76a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_F30 ( Bool mode64 ) { return FR (mode64, 30, 19, 19); } 77a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 78a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj// DRs are only allocatable in 32-bit mode, so the 64-bit index numbering 79a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj// doesn't advance here. 80a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_D0 ( Bool mode64 ) { vassert(!mode64); 81a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj return DR (mode64, 0, 0, 20); } 82a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_D1 ( Bool mode64 ) { vassert(!mode64); 83a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj return DR (mode64, 2, 0, 21); } 84a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_D2 ( Bool mode64 ) { vassert(!mode64); 85a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj return DR (mode64, 4, 0, 22); } 86a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_D3 ( Bool mode64 ) { vassert(!mode64); 87a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj return DR (mode64, 6, 0, 23); } 88a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_D4 ( Bool mode64 ) { vassert(!mode64); 89a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj return DR (mode64, 8, 0, 24); } 90a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_D5 ( Bool mode64 ) { vassert(!mode64); 91a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj return DR (mode64, 10, 0, 25); } 92a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_D6 ( Bool mode64 ) { vassert(!mode64); 93a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj return DR (mode64, 12, 0, 26); } 94a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_D7 ( Bool mode64 ) { vassert(!mode64); 95a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj return DR (mode64, 14, 0, 27); } 96a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 97a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_HI ( Bool mode64 ) { return FR (mode64, 33, 20, 28); } 98a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_LO ( Bool mode64 ) { return FR (mode64, 34, 21, 29); } 99a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 100a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR0 ( Bool mode64 ) { return GPR(mode64, 0, 22, 30); } 101a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR1 ( Bool mode64 ) { return GPR(mode64, 1, 23, 31); } 102a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR2 ( Bool mode64 ) { return GPR(mode64, 2, 24, 32); } 103a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR3 ( Bool mode64 ) { return GPR(mode64, 3, 25, 33); } 104a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR4 ( Bool mode64 ) { return GPR(mode64, 4, 26, 34); } 105a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR5 ( Bool mode64 ) { return GPR(mode64, 5, 27, 35); } 106a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR6 ( Bool mode64 ) { return GPR(mode64, 6, 28, 36); } 107a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR7 ( Bool mode64 ) { return GPR(mode64, 7, 29, 37); } 108a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR8 ( Bool mode64 ) { return GPR(mode64, 8, 30, 38); } 109a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR9 ( Bool mode64 ) { return GPR(mode64, 9, 31, 39); } 110a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR10 ( Bool mode64 ) { return GPR(mode64, 10, 32, 40); } 111a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR11 ( Bool mode64 ) { return GPR(mode64, 11, 33, 41); } 112a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR23 ( Bool mode64 ) { return GPR(mode64, 23, 34, 42); } 113a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR25 ( Bool mode64 ) { return GPR(mode64, 25, 35, 43); } 114a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR29 ( Bool mode64 ) { return GPR(mode64, 29, 36, 44); } 115a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjST_IN HReg hregMIPS_GPR31 ( Bool mode64 ) { return GPR(mode64, 31, 37, 45); } 116a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 117a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#undef ST_IN 118a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#undef GPR 119a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#undef FR 120a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#undef DR 121362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 122b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#define GuestStatePointer(_mode64) hregMIPS_GPR23(_mode64) 123362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#define StackFramePointer(_mode64) hregMIPS_GPR30(_mode64) 124362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj#define StackPointer(_mode64) hregMIPS_GPR29(_mode64) 125a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 126a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj/* Num registers used for function calls */ 127a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#if defined(VGP_mips32_linux) 128a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj /* a0, a1, a2, a3 */ 129a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj# define MIPS_N_REGPARMS 4 130a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj#else 131a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj /* a0, a1, a2, a3, a4, a5, a6, a7 */ 132a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj# define MIPS_N_REGPARMS 8 133b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#endif 134362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 135a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjextern void ppHRegMIPS ( HReg, Bool ); 136a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 137a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 138362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- Condition codes, Intel encoding. --------- */ 139362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef enum { 140b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_EQ = 0, /* equal */ 141b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_NE = 1, /* not equal */ 142362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 143b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_HS = 2, /* >=u (higher or same) */ 144b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_LO = 3, /* <u (lower) */ 145362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 146b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_MI = 4, /* minus (negative) */ 147b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_PL = 5, /* plus (zero or +ve) */ 148362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 149b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_VS = 6, /* overflow */ 150b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_VC = 7, /* no overflow */ 151362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 152b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_HI = 8, /* >u (higher) */ 153b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_LS = 9, /* <=u (lower or same) */ 154362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 155b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_GE = 10, /* >=s (signed greater or equal) */ 156b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_LT = 11, /* <s (signed less than) */ 157362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 158b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_GT = 12, /* >s (signed greater) */ 159b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_LE = 13, /* <=s (signed less or equal) */ 160362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 161b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_AL = 14, /* always (unconditional) */ 162b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPScc_NV = 15 /* never (unconditional): */ 163362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSCondCode; 164362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 16555085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar *showMIPSCondCode(MIPSCondCode); 166362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 167362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- Memory address expressions (amodes). --------- */ 168362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef enum { 169362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mam_IR, /* Immediate (signed 16-bit) + Reg */ 170362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mam_RR /* Reg1 + Reg2 */ 171362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSAModeTag; 172362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 173362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef struct { 174362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAModeTag tag; 175362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj union { 176362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 177362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg base; 178362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Int index; 179362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } IR; 180362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 181362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg base; 182362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg index; 183362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } RR; 184362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Mam; 185362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSAMode; 186362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 187362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSAMode *MIPSAMode_IR(Int, HReg); 188362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSAMode *MIPSAMode_RR(HReg, HReg); 189362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 190362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSAMode *dopyMIPSAMode(MIPSAMode *); 191362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSAMode *nextMIPSAModeFloat(MIPSAMode *); 192362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSAMode *nextMIPSAModeInt(MIPSAMode *); 193362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 194362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern void ppMIPSAMode(MIPSAMode *, Bool); 195362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 196362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- Operand, which can be a reg or a u16/s16. --------- */ 197362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* ("RH" == "Register or Halfword immediate") */ 198362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef enum { 199362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mrh_Imm, 200362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mrh_Reg 201362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSRHTag; 202362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 203362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef struct { 204362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSRHTag tag; 205362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj union { 206362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 207362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool syned; 208362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj UShort imm16; 209362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Imm; 210362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 211362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg reg; 212362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Reg; 213362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Mrh; 214362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSRH; 215362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 216362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern void ppMIPSRH(MIPSRH *, Bool); 217362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 218362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSRH *MIPSRH_Imm(Bool, UShort); 219362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSRH *MIPSRH_Reg(HReg); 220362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 221362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- Instructions. --------- */ 222362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 223362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*Tags for operations*/ 224362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 225362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- */ 226362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef enum { 227362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mun_CLO, 228362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mun_CLZ, 229b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Mun_DCLO, 230b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Mun_DCLZ, 231362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mun_NOP, 232362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSUnaryOp; 233362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 23455085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar *showMIPSUnaryOp(MIPSUnaryOp); 235362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- */ 236362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 237362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- */ 238362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 239362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef enum { 240362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Malu_INVALID, 241362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Malu_ADD, Malu_SUB, 242362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Malu_AND, Malu_OR, Malu_NOR, Malu_XOR, 243b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Malu_DADD, Malu_DSUB, 244b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Malu_SLT 245362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSAluOp; 246362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 24755085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar *showMIPSAluOp(MIPSAluOp, 248362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool /* is the 2nd operand an immediate? */ ); 249362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 250362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- */ 251362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef enum { 252362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mshft_INVALID, 253362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mshft_SLL, Mshft_SRL, 254362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mshft_SRA 255362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSShftOp; 256362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 25755085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar *showMIPSShftOp(MIPSShftOp, 258362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool /* is the 2nd operand an immediate? */ , 259362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool /* is this a 32bit or 64bit op? */ ); 260362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 261362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- */ 262362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef enum { 263362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Macc_ADD, 264362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Macc_SUB 265362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSMaccOp; 266362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 26755085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar *showMIPSMaccOp(MIPSMaccOp, Bool); 268362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- */ 269362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 270362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* ----- Instruction tags ----- */ 271362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef enum { 272b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_LI, /* load word (32/64-bit) immediate (fake insn) */ 273b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Alu, /* word add/sub/and/or/xor/nor/others? */ 274b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Shft, /* word sll/srl/sra */ 275b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Unary, /* clo, clz, nop, neg */ 276362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 277b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Cmp, /* word compare (fake insn) */ 278362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 279b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Mul, /* widening/non-widening multiply */ 280b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Div, /* div */ 281362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 282b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Call, /* call to address in register */ 283362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 284362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* The following 5 insns are mandated by translation chaining */ 285b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_XDirect, /* direct transfer to GA */ 286b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_XIndir, /* indirect transfer to GA */ 287b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_XAssisted, /* assisted transfer to GA */ 288b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_EvCheck, /* Event check */ 289b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_ProfInc, /* 64-bit profile counter increment */ 290b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 291b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_RdWrLR, /* Read/Write Link Register */ 292b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Mthi, /* Move to HI from GP register */ 293b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Mtlo, /* Move to LO from GP register */ 294b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Mfhi, /* Move from HI to GP register */ 295b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Mflo, /* Move from LO to GP register */ 296b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Macc, /* Multiply and accumulate */ 297b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 298b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Load, /* zero-extending load a 8|16|32 bit value from mem */ 299b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_Store, /* store a 8|16|32 bit value to mem */ 3006ced72b3286a45a9fd05989a1e13c0ac5b911feedejanj Min_Cas, /* compare and swap */ 301b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_LoadL, /* mips Load Linked Word - LL */ 302b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_StoreC, /* mips Store Conditional Word - SC */ 303b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 304b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpUnary, /* FP unary op */ 305b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpBinary, /* FP binary op */ 306b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpTernary, /* FP ternary op */ 307b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpConvert, /* FP conversion op */ 308b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpMulAcc, /* FP multipy-accumulate style op */ 309b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpLdSt, /* FP load/store */ 310b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpSTFIW, /* stfiwx */ 311b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpRSP, /* FP round IEEE754 double to IEEE754 single */ 312b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpCftI, /* fcfid/fctid/fctiw */ 313b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpCMov, /* FP floating point conditional move */ 314b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_MtFCSR, /* set FCSR register */ 315b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_MfFCSR, /* get FCSR register */ 316b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpCompare, /* FP compare, generating value into int reg */ 317b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 318b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_FpGpMove, /* Move from/to fpr to/from gpr */ 319b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Min_MoveCond /* Move Conditional */ 320362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSInstrTag; 321362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 322362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* --------- */ 323362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef enum { 324362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mfp_INVALID, 325362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 326362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Ternary */ 327362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mfp_MADDD, Mfp_MSUBD, 328362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mfp_MADDS, Mfp_MSUBS, 329362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 330362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Binary */ 331362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mfp_ADDD, Mfp_SUBD, Mfp_MULD, Mfp_DIVD, 332b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Mfp_ADDS, Mfp_SUBS, Mfp_MULS, Mfp_DIVS, 333362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 334362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Unary */ 335c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj Mfp_SQRTS, Mfp_SQRTD, 336362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Mfp_ABSS, Mfp_ABSD, Mfp_NEGS, Mfp_NEGD, Mfp_MOVS, Mfp_MOVD, 337b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 338b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj /* FP convert */ 339b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Mfp_CVTSD, Mfp_CVTSW, Mfp_CVTWD, 340b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Mfp_CVTWS, Mfp_CVTDL, Mfp_CVTSL, Mfp_CVTLS, Mfp_CVTLD, Mfp_TRULS, Mfp_TRULD, 341b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Mfp_TRUWS, Mfp_TRUWD, Mfp_FLOORWS, Mfp_FLOORWD, Mfp_ROUNDWS, Mfp_ROUNDWD, 342f37c086134874a2ba372f6750a45466473a813b1dejanj Mfp_CVTDW, Mfp_CEILWS, Mfp_CEILWD, Mfp_CEILLS, Mfp_CEILLD, Mfp_CVTDS, 343f37c086134874a2ba372f6750a45466473a813b1dejanj Mfp_ROUNDLD, Mfp_FLOORLD, 344f37c086134874a2ba372f6750a45466473a813b1dejanj 345f37c086134874a2ba372f6750a45466473a813b1dejanj /* FP compare */ 346f37c086134874a2ba372f6750a45466473a813b1dejanj Mfp_CMP_UN, Mfp_CMP_EQ, Mfp_CMP_LT, Mfp_CMP_NGT 347b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 348362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSFpOp; 349362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 35055085f8680acc89d727e321f3b34cae1a8c4093aflorianextern const HChar *showMIPSFpOp(MIPSFpOp); 351362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 352b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj/* Move from/to fpr to/from gpr */ 353b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjtypedef enum { 354b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MFpGpMove_mfc1, /* Move Word From Floating Point - MIPS32 */ 355b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MFpGpMove_dmfc1, /* Doubleword Move from Floating Point - MIPS64 */ 356b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MFpGpMove_mtc1, /* Move Word to Floating Point - MIPS32 */ 357b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MFpGpMove_dmtc1 /* Doubleword Move to Floating Point - MIPS64 */ 358b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj} MIPSFpGpMoveOp; 359b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 360b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjextern const HChar *showMIPSFpGpMoveOp ( MIPSFpGpMoveOp ); 361b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 362b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj/* Move Conditional */ 363b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjtypedef enum { 364b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MFpMoveCond_movns, /* FP Move Conditional on Not Zero - MIPS32 */ 365b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MFpMoveCond_movnd, 366b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MMoveCond_movn /* Move Conditional on Not Zero */ 367b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj} MIPSMoveCondOp; 368b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 369b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjextern const HChar *showMIPSMoveCondOp ( MIPSMoveCondOp ); 370b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 371362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*--------- Structure for instructions ----------*/ 372362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* Destinations are on the LEFT (first operand) */ 373362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 374362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjtypedef struct { 375362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSInstrTag tag; 376362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj union { 377362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Get a 32/64-bit literal into a register. 378362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj May turn into a number of real insns. */ 379362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 380362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 381362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj ULong imm; 382362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } LI; 383362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Integer add/sub/and/or/xor. Limitations: 384362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj - For add, the immediate, if it exists, is a signed 16. 385362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj - For sub, the immediate, if it exists, is a signed 16 386362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj which may not be -32768, since no such instruction 387362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj exists, and so we have to emit addi with +32768, but 388362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj that is not possible. 389362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj - For and/or/xor, the immediate, if it exists, 390362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj is an unsigned 16. 391362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj */ 392362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 393362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAluOp op; 394362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 395362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcL; 396362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSRH *srcR; 397362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Alu; 398362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Integer shl/shr/sar. 399362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Limitations: the immediate, if it exists, 400362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj is a signed 5-bit value between 1 and 31 inclusive. 401362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj */ 402362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 403362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSShftOp op; 404362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool sz32; /* mode64 has both 32 and 64bit shft */ 405362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 406362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcL; 407362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSRH *srcR; 408362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Shft; 409362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Clz, Clo, nop */ 410362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 411362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSUnaryOp op; 412362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 413362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg src; 414362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Unary; 415362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Word compare. Fake instruction, used for basic block ending */ 416362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 417362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool syned; 418362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool sz32; 419362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 420362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcL; 421362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcR; 422362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 423362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSCondCode cond; 424362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Cmp; 425362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 426b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Bool widening; /* True => widening, False => non-widening */ 427b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Bool syned; /* signed/unsigned - meaningless if widenind = False */ 428362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool sz32; 429362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 430362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcL; 431362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcR; 432362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Mul; 433362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 434b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Bool syned; /* signed/unsigned - meaningless if widenind = False */ 435362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool sz32; 436362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcL; 437362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcR; 438362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Div; 439362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Pseudo-insn. Call target (an absolute address), on given 440362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj condition (which could be Mcc_ALWAYS). argiregs indicates 441b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj which of $4 .. $7 (mips32) or $4 .. $11 (mips64) 442362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj carries argument values for this call, 443b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj using a bit mask (1<<N is set if $N holds an arg, for N in 444b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj $4 .. $7 or $4 .. $11 inclusive). 445362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj If cond is != Mcc_ALWAYS, src is checked. 446362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Otherwise, unconditional call */ 447362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 448362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSCondCode cond; 449b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Addr64 target; 450362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj UInt argiregs; 451362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg src; 452cfe046e178666280b87da998b1b52ecda03ecd89sewardj RetLoc rloc; /* where the return value will be */ 453362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Call; 454362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Update the guest EIP value, then exit requesting to chain 455362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj to it. May be conditional. Urr, use of Addr32 implicitly 456362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj assumes that wordsize(guest) == wordsize(host). */ 457362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 458b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Addr64 dstGA; /* next guest address */ 459b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPSAMode* amPC; /* amode in guest state for PC */ 460b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPSCondCode cond; /* can be MIPScc_AL */ 461b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj Bool toFastEP; /* chain to the slow or fast point? */ 462362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } XDirect; 463362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Boring transfer to a guest address not known at JIT time. 464362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Not chainable. May be conditional. */ 465362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 466362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dstGA; 467362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode* amPC; 468362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSCondCode cond; /* can be MIPScc_AL */ 469362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } XIndir; 470362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Assisted transfer to a guest address, most general case. 471362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Not chainable. May be conditional. */ 472362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 473362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dstGA; 474362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode* amPC; 475362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSCondCode cond; /* can be MIPScc_AL */ 476362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj IRJumpKind jk; 477362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } XAssisted; 478362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Zero extending loads. Dst size is host word size */ 479362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 480362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj UChar sz; /* 1|2|4|8 */ 481362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 482362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode *src; 483362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Load; 484362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* 64/32/16/8 bit stores */ 485362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 486362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj UChar sz; /* 1|2|4|8 */ 487362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode *dst; 488362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg src; 489362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Store; 490362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 491362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj UChar sz; /* 4|8 */ 492362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 493362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode *src; 494362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } LoadL; 495362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 496362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj UChar sz; /* 4|8 */ 4976ced72b3286a45a9fd05989a1e13c0ac5b911feedejanj HReg old; 4986ced72b3286a45a9fd05989a1e13c0ac5b911feedejanj HReg addr; 4996ced72b3286a45a9fd05989a1e13c0ac5b911feedejanj HReg expd; 5006ced72b3286a45a9fd05989a1e13c0ac5b911feedejanj HReg data; 5016ced72b3286a45a9fd05989a1e13c0ac5b911feedejanj } Cas; 5026ced72b3286a45a9fd05989a1e13c0ac5b911feedejanj struct { 5036ced72b3286a45a9fd05989a1e13c0ac5b911feedejanj UChar sz; /* 4|8 */ 504362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode *dst; 505362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg src; 506362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } StoreC; 507362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Move from HI/LO register to GP register. */ 508362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 509362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 510362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } MfHL; 511362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 512362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Move to HI/LO register from GP register. */ 513362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 514362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg src; 515362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } MtHL; 516362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 517362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Read/Write Link Register */ 518362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 519362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool wrLR; 520362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg gpr; 521362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } RdWrLR; 522362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 523362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* MIPS Multiply and accumulate instructions. */ 524362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 525362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSMaccOp op; 526362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool syned; 527362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 528362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcL; 529362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcR; 530362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Macc; 531362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 532362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* MIPS Floating point */ 533362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 534362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSFpOp op; 535362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 536362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg src; 537362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } FpUnary; 538362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 539362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSFpOp op; 540362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 541362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcL; 542362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcR; 543362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } FpBinary; 544362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 545362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSFpOp op; 546362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 547b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg src1; 548b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg src2; 549b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg src3; 550b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj } FpTernary; 551b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj struct { 552b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPSFpOp op; 553b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg dst; 554362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcML; 555362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcMR; 556362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcAcc; 557362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } FpMulAcc; 558362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 559362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool isLoad; 560362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj UChar sz; /* only 4 (IEEE single) or 8 (IEEE double) */ 561362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg reg; 562362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode *addr; 563362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } FpLdSt; 564362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 565362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 566362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSFpOp op; 567362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 568362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg src; 569362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } FpConvert; 570362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 571362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSFpOp op; 572362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 573362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcL; 574362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcR; 575362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj UChar cond1; 576362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } FpCompare; 577362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Move from GP register to FCSR register. */ 578362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 579362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg src; 580362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } MtFCSR; 581362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* Move from FCSR register to GP register. */ 582362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 583362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg dst; 584362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } MfFCSR; 585362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 586362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode* amCounter; 587362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode* amFailAddr; 588362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } EvCheck; 589362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj struct { 590362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj /* No fields. The address of the counter to inc is 591362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj installed later, post-translation, by patching it in, 592362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj as it is not known at translation time. */ 593362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } ProfInc; 594362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 595b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj /* Move from/to fpr to/from gpr */ 596b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj struct { 597b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPSFpGpMoveOp op; 598b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg dst; 599b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg src; 600b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj } FpGpMove; 601b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj struct { 602b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPSMoveCondOp op; 603b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg dst; 604b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg src; 605b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg cond; 606b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj } MoveCond; 607b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 608362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj } Min; 609362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj} MIPSInstr; 610362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 611362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_LI(HReg, ULong); 612362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Alu(MIPSAluOp, HReg, HReg, MIPSRH *); 613362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Shft(MIPSShftOp, Bool sz32, HReg, HReg, MIPSRH *); 614362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Unary(MIPSUnaryOp op, HReg dst, HReg src); 615362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Cmp(Bool, Bool, HReg, HReg, HReg, MIPSCondCode); 616362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 617362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Mul(Bool syned, Bool hi32, Bool sz32, HReg, 618362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg, HReg); 619362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Div(Bool syned, Bool sz32, HReg, HReg); 620362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Madd(Bool, HReg, HReg); 621362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Msub(Bool, HReg, HReg); 622362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 623362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Load(UChar sz, HReg dst, MIPSAMode * src, 624362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool mode64); 625362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Store(UChar sz, MIPSAMode * dst, HReg src, 626362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool mode64); 627362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 628362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_LoadL(UChar sz, HReg dst, MIPSAMode * src, 629362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool mode64); 630362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_StoreC(UChar sz, MIPSAMode * dst, HReg src, 631362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool mode64); 6326ced72b3286a45a9fd05989a1e13c0ac5b911feedejanjextern MIPSInstr *MIPSInstr_Cas(UChar sz, HReg old, HReg addr, 6336ced72b3286a45a9fd05989a1e13c0ac5b911feedejanj HReg expd, HReg data, Bool mode64); 634362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 635b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjextern MIPSInstr *MIPSInstr_Call ( MIPSCondCode, Addr64, UInt, HReg, RetLoc ); 636b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjextern MIPSInstr *MIPSInstr_CallAlways ( MIPSCondCode, Addr64, UInt, RetLoc ); 637362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 638b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjextern MIPSInstr *MIPSInstr_XDirect ( Addr64 dstGA, MIPSAMode* amPC, 639b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj MIPSCondCode cond, Bool toFastEP ); 640362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_XIndir(HReg dstGA, MIPSAMode* amPC, 641362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSCondCode cond); 642362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_XAssisted(HReg dstGA, MIPSAMode* amPC, 643362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSCondCode cond, IRJumpKind jk); 644362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 645362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpUnary(MIPSFpOp op, HReg dst, HReg src); 646362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpBinary(MIPSFpOp op, HReg dst, HReg srcL, 647362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcR); 648b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjextern MIPSInstr *MIPSInstr_FpTernary ( MIPSFpOp op, HReg dst, HReg src1, 649b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg src2, HReg src3 ); 650362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpConvert(MIPSFpOp op, HReg dst, HReg src); 651362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpCompare(MIPSFpOp op, HReg dst, HReg srcL, 652f37c086134874a2ba372f6750a45466473a813b1dejanj HReg srcR); 653362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpMulAcc(MIPSFpOp op, HReg dst, HReg srcML, 654362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg srcMR, HReg srcAcc); 655362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpLdSt(Bool isLoad, UChar sz, HReg, MIPSAMode *); 656362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpSTFIW(HReg addr, HReg data); 657362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpRSP(HReg dst, HReg src); 658362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpCftI(Bool fromI, Bool int32, HReg dst, HReg src); 659362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpCMov(MIPSCondCode, HReg dst, HReg src); 660362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_MtFCSR(HReg src); 661362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_MfFCSR(HReg dst); 662362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_FpCmp(HReg dst, HReg srcL, HReg srcR); 663362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 664362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Mfhi(HReg dst); 665362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Mflo(HReg dst); 666362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Mthi(HReg src); 667362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_Mtlo(HReg src); 668362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 669362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_RdWrLR(Bool wrLR, HReg gpr); 670362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 671b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjextern MIPSInstr *MIPSInstr_MoveCond ( MIPSMoveCondOp op, HReg dst, 672b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj HReg src, HReg cond ); 673b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 674b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjextern MIPSInstr *MIPSInstr_FpGpMove ( MIPSFpGpMoveOp op, HReg dst, HReg src ); 675362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 676362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_EvCheck(MIPSAMode* amCounter, 677362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj MIPSAMode* amFailAddr ); 678362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern MIPSInstr *MIPSInstr_ProfInc( void ); 679362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 680d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern void ppMIPSInstr(const MIPSInstr *, Bool mode64); 681362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 682362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* Some functions that insulate the register allocator from details 683362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj of the underlying instruction set. */ 684d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern void getRegUsage_MIPSInstr (HRegUsage *, const MIPSInstr *, Bool); 685d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern void mapRegs_MIPSInstr (HRegRemap *, MIPSInstr *, Bool mode64); 686d8c64e082224b2e688abdef9219cc76fd82b373bflorianextern Bool isMove_MIPSInstr (const MIPSInstr *, HReg *, HReg *); 6878462d113e3efeacceb304222dada8d85f748295aflorianextern Int emit_MIPSInstr (/*MB_MOD*/Bool* is_profInc, 688d8c64e082224b2e688abdef9219cc76fd82b373bflorian UChar* buf, Int nbuf, const MIPSInstr* i, 6898462d113e3efeacceb304222dada8d85f748295aflorian Bool mode64, 6908462d113e3efeacceb304222dada8d85f748295aflorian VexEndness endness_host, 6918462d113e3efeacceb304222dada8d85f748295aflorian const void* disp_cp_chain_me_to_slowEP, 6928462d113e3efeacceb304222dada8d85f748295aflorian const void* disp_cp_chain_me_to_fastEP, 6938462d113e3efeacceb304222dada8d85f748295aflorian const void* disp_cp_xindir, 6948462d113e3efeacceb304222dada8d85f748295aflorian const void* disp_cp_xassisted ); 695362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 696362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern void genSpill_MIPS ( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2, 697362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg rreg, Int offset, Bool); 698362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardjextern void genReload_MIPS( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2, 699362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj HReg rreg, Int offset, Bool); 700362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 701a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardjextern const RRegUniverse* getRRegUniverse_MIPS ( Bool mode64 ); 702a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 703cacba8e675988fbf21b08feea1f317a9c896c053florianextern HInstrArray *iselSB_MIPS ( const IRSB*, 704362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj VexArch, 705d8c64e082224b2e688abdef9219cc76fd82b373bflorian const VexArchInfo*, 706d8c64e082224b2e688abdef9219cc76fd82b373bflorian const VexAbiInfo*, 707362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Int offs_Host_EvC_Counter, 708362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Int offs_Host_EvC_FailAddr, 709362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool chainingAllowed, 710362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool addProfInc, 711dcd6d236c9aef7d4c84369d4c51f6b92ac910127florian Addr max_ga ); 712362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 713362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* How big is an event check? This is kind of a kludge because it 714362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj depends on the offsets of host_EvC_FAILADDR and host_EvC_COUNTER, 715362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj and so assumes that they are both <= 128, and so can use the short 716362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj offset encoding. This is all checked with assertions, so in the 717362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj worst case we will merely assert at startup. */ 7187ce2cc883c5b36586babec833838951ecf9f2a76florianextern Int evCheckSzB_MIPS (void); 719362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 720362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* Perform a chaining and unchaining of an XDirect jump. */ 7219b76916dcc1628e133d57db001563429c6e3a590sewardjextern VexInvalRange chainXDirect_MIPS ( VexEndness endness_host, 7229b76916dcc1628e133d57db001563429c6e3a590sewardj void* place_to_chain, 7237d6f81de12e6d8deb3e119ab318f361d97a10a65florian const void* disp_cp_chain_me_EXPECTED, 7247d6f81de12e6d8deb3e119ab318f361d97a10a65florian const void* place_to_jump_to, 725362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool mode64 ); 726362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 7279b76916dcc1628e133d57db001563429c6e3a590sewardjextern VexInvalRange unchainXDirect_MIPS ( VexEndness endness_host, 7289b76916dcc1628e133d57db001563429c6e3a590sewardj void* place_to_unchain, 7297d6f81de12e6d8deb3e119ab318f361d97a10a65florian const void* place_to_jump_to_EXPECTED, 7307d6f81de12e6d8deb3e119ab318f361d97a10a65florian const void* disp_cp_chain_me, 731362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool mode64 ); 732362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 733362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/* Patch the counter location into an existing ProfInc point. */ 7349b76916dcc1628e133d57db001563429c6e3a590sewardjextern VexInvalRange patchProfInc_MIPS ( VexEndness endness_host, 7359b76916dcc1628e133d57db001563429c6e3a590sewardj void* place_to_patch, 7367d6f81de12e6d8deb3e119ab318f361d97a10a65florian const ULong* location_of_counter, 737362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj Bool mode64 ); 738362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 7399b76916dcc1628e133d57db001563429c6e3a590sewardj#endif /* ndef __VEX_HOST_MIPS_DEFS_H */ 740362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj 741362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*---------------------------------------------------------------*/ 742362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*--- end host-mips_defs.h ---*/ 743362cf841bd241b9eb32e63bcab8b1f0042caa6f0sewardj/*---------------------------------------------------------------*/ 744