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