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