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